Az üzemeltetés kiterjesztése a ServiceHostFactory használatával
A Windows Communication Foundation (WCF) szolgáltatásainak üzemeltetésére szolgáló standard ServiceHost API a WCF-architektúra bővíthetőségi pontja. A felhasználók a szolgáltatás megnyitása előtt létrehozhatják saját gazdagéposztályaikat ServiceHost, amelyek általában felülbírálhatók OnOpening()ServiceDescription az alapértelmezett végpontok hozzáadásához vagy viselkedésük módosításához.
Az önkiszolgáló környezetben nem kell egyénit ServiceHost létrehoznia, mert megírja a kódot, amely példányosítja a gazdagépet, majd meghívja Open() azt a példányosítás után. A két lépés között azt tehetsz, amit akarsz. Felvehet például egy újat IServiceBehavior:
public static void Main()
{
ServiceHost host = new ServiceHost( typeof( MyService ) );
host.Description.Add( new MyServiceBehavior() );
host.Open();
...
}
Ez a megközelítés nem használható újra. A leírást módosító kód a gazdaprogramba (ebben az esetben a Main() függvénybe van kódva, így ezt a logikát nehéz más kontextusokban újra felhasználni. Más módokon is hozzáadhat olyanokat IServiceBehavior , amelyek nem igényelnek imperatív kódot. A szolgáltatás implementálási típusából ServiceBehaviorAttribute származtathat és helyezhet el egy attribútumot, vagy konfigurálhatóvá teheti az egyéni viselkedést, és dinamikusan megírhatja a konfigurációval.
A probléma megoldásához azonban a példa egy kis változata is használható. Az egyik módszer a ServiceBehaviort hozzáadó kód áthelyezése a OnOpening következő egyéni származékos metódusából Main()
ServiceHostés metódusába:
public class DerivedHost : ServiceHost
{
public DerivedHost( Type t, params Uri baseAddresses ) :
base( t, baseAddresses ) {}
public override void OnOpening()
{
this.Description.Add( new MyServiceBehavior() );
}
}
Ezután belül Main()
a következőt használhatja:
public static void Main()
{
ServiceHost host = new DerivedHost( typeof( MyService ) );
host.Open();
...
}
Most egy tiszta absztrakcióba ágyazta be az egyéni logikát, amely könnyen újra felhasználható számos különböző gazdagép-végrehajtható fájlban.
Nem egyértelmű azonnal, hogyan használhatja ezt az egyéni szolgáltatást ServiceHost az Internet Information Services (IIS) vagy a Windows Folyamataktiválási szolgáltatás (WAS) szolgáltatáson belülről. Ezek a környezetek eltérnek az önkiszolgáló környezetétől, mivel az alkalmazás nevében az ServiceHost üzemeltetési környezet az egyetlen példány. Az IIS és a WAS üzemeltetési infrastruktúrája nem tud semmit az egyéni ServiceHost származékról.
A ServiceHostFactory rendszer úgy lett kialakítva, hogy megoldja az egyéni ServiceHost hozzáféréssel kapcsolatos problémát az IIS-ből vagy a WAS-ból. Mivel az egyéni gazdagép, amelyből ServiceHost származik, dinamikusan van konfigurálva, és potenciálisan különböző típusú, az üzemeltetési környezet soha nem példányosítja közvetlenül. Ehelyett a WCF egy gyári mintával biztosít egy indirekt réteget az üzemeltetési környezet és a szolgáltatás konkrét típusa között. Ha nem mondja el másként, az alapértelmezett implementációt ServiceHostFactory használja, amely egy példányt ServiceHostad vissza. De saját gyárat is megadhat, amely visszaadja a származtatott gazdagépet, ha megadja a gyári implementáció CLR-típusnevét az @ServiceHost irányelvben.
A szándék az, hogy alapesetben a saját gyár implementálása egyenes előremutató gyakorlat legyen. Itt látható például egy olyan egyéni érték ServiceHostFactory , amely származtatott értéket ad ServiceHostvissza:
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new DerivedHost( t, baseAddresses )
}
}
Ha ezt a gyárat szeretné használni az alapértelmezett gyár helyett, adja meg a típusnevet az irányelvben az @ServiceHost alábbiak szerint:
<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>
Bár nincs technikai korlát arra, hogy azt tegye, amit vissza szeretne ServiceHost kapni CreateServiceHost, javasoljuk, hogy a lehető legegyszerűbben tartsa meg a gyári implementációkat. Ha sok egyéni logikával rendelkezik, jobb, ha ezt a logikát a gazdagépen belül helyezi el, nem pedig a gyáron belül, hogy újra felhasználható legyen.
Van még egy réteg az üzemeltetési API-hoz, amelyet itt kell megemlíteni. A WCF emellett rendelkezik ServiceHostBase és ServiceHostFactoryBase, amelyekből ServiceHost származik és ServiceHostFactory származik. Ezek speciálisabb forgatókönyvek esetén léteznek, ahol a metaadat-rendszer nagy részét fel kell cserélnie saját testreszabott alkotásaival.