Megosztás a következőn keresztül:


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.