2024. május 10., péntek

Gyorskeresés

WCF dependency injection

Írta: | Kulcsszavak: wcf . ninject . dependency injection . net.tcp

[ ÚJ BEJEGYZÉS ]

A dependency injection-t remélhetőleg már nem kell bemutatni, mi is lenne, ám azt úgy gondolom, kevesebben tudják, amibe sikeürlt belefutnom.

Történt ugyanis, hogy hősünk egy faék WCF service-t szeretett volna készíteni, amit sikerült is megépíteni, hasznos unit test-ekkel körülbástyázni, remekül működött.
A probléma akkor kezdődött, mikor tényleges service-ként kellett volna működésbe hozni, tesztelés alatt ugyanis nem történik nagy varázslat, simán példányosítással történik a működés ellenőrzés.

IIS-en host-olt WCF service-ek aktivációját mindig egy factory végzi, amit mi magunk is beállíthatunk, ha megnézzük a *.svc fájlunk markup-ját, abba az egyetlen direktívába kell felvennünk a Factory-nkat:

<%@ ServiceHost Language="C#" Debug="true" Service="SmartcardService.Authentication"
CodeBehind="Authentication.svc.cs" Factory="SmartcardService.Factory.ServiceFactory" %>

Ennek a service-nek nincs paraméter nélküli konstruktora (hogy lenne?), így érdemes egy DI framework-öt választani, aminek van WCF-es támogatása (van neki WCF factory-ja) is, nekem a Ninject-re esett a választásom, factory-ja: NinjectServiceHostFactory

A Ninject úgy működik, hogy a Global.asax HttpApplication-től való származtatását el kell dobni, és ki kell cserélni a NinjectHttpApplication-re. Ezek után implementálnunk kell egy CreateKernel nevű metódust, amivel a DI magját állítjuk elő, ez az a pont, ahol a függőségek feloldásának módját is regisztrálnunk kell. Elég egyszerű ez a dolog, világosan érthető, hogyan is fog működni, és tényleg működik. Vagy mégsem?

A gond akkor jelentkezett, amikor net.tcp binding-gal szerettem volna használni a service-t (maga a service discovery is működött a service-t meghívó tesztalkalmazásból), már az aktiválása is meghalt. Egy ideig nem értettem, miért is, de némi olvasgatás után leesett, hogy NinjectHttpApplication nem fog működésbe lépni net.tcp binding esetén, így DI container-em sem fog nőni, ezért kaptam ArgumentNullException-t is.

A problémára volt megoldás, de a verziók növelésével változott annyit a Ninject, hogy az egy éves ötletek, már ne érjenek semmit. Amit lehetett tenni, az egy saját factory készítése a NinjectServiceHostFactory-ból való származtatással.

public ServiceFactory()
{
var kernel = new StandardKernel(new DependencyConfiguration());

SetKernel(kernel);
}

Sajnos biztos belépési pont híján a ctor-ba kellett minden beépítenem, de sebaj (gyakorlatilag ez egy nem tesztelendő része a játéknak). A SetKernel metódus egy static szörny, ami a BaseNinjectServiceHostFactory-ban lakik.

Ha valaki esetleg találkozna ilyen aprósággal, akkor tudjon róla, kb. miért van.

Hozzászólások

(#1) Peter Kiss


Peter Kiss
senior tag
LOGOUT blog

[ azért én nem röhögtem ]

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.