Rozšíření hostování pomocí třídy ServiceHostFactory

Standardní ServiceHost rozhraní API pro hostování služeb ve Windows Communication Foundation (WCF) je bod rozšiřitelnosti v architektuře WCF. Uživatelé mohou odvodit své vlastní třídy hostitelů , ServiceHostobvykle k přepsání OnOpening() použít ServiceDescription k přidání výchozích koncových bodů imperativní nebo změnit chování před otevřením služby.

V místním hostitelském prostředí nemusíte vytvářet vlastní ServiceHost kód, protože napíšete kód, který vytvoří instanci hostitele, a potom ho zavoláte Open() po vytvoření instance. Mezi těmito dvěma kroky můžete dělat, co chcete. Můžete například přidat novou IServiceBehavior:

public static void Main()  
{  
   ServiceHost host = new ServiceHost( typeof( MyService ) );  
   host.Description.Add( new MyServiceBehavior() );  
   host.Open();  
  
   ...  
}  

Tento přístup není opakovaně použitelný. Kód, který manipuluje s popisem, je kódovaný do hostitelského programu (v tomto případě funkce Main(), takže je obtížné tuto logiku znovu použít v jiných kontextech. Existují také další způsoby přidání IServiceBehavior , které nevyžadují imperativní kód. Můžete odvodit ServiceBehaviorAttribute atribut a dát ho do typu implementace služby, nebo můžete vytvořit vlastní chování konfigurovatelné a vytvořit ho dynamicky pomocí konfigurace.

K vyřešení tohoto problému se ale dá použít i nepatrná variace příkladu. Jedním z přístupů je přesunout kód, který přidá ServiceBehavior z Main() a do OnOpening metody vlastní derivátu ServiceHost:

public class DerivedHost : ServiceHost  
{  
   public DerivedHost( Type t, params Uri baseAddresses ) :  
      base( t, baseAddresses ) {}  
  
   public override void OnOpening()  
   {  
  this.Description.Add( new MyServiceBehavior() );  
   }  
}  

Main() Pak uvnitř můžete použít:

public static void Main()  
{  
   ServiceHost host = new DerivedHost( typeof( MyService ) );  
   host.Open();  
  
   ...  
}  

Teď jste zapouzdřeli vlastní logiku do čisté abstrakce, kterou je možné snadno znovu použít v mnoha různých spustitelných souborech hostitele.

Není okamžitě zřejmé, jak používat tento vlastní kód ServiceHost z Internetová informační služba (IIS) nebo služby aktivace procesu systému Windows (WAS). Tato prostředí se liší od místního hostitelského prostředí, protože hostitelské prostředí představuje instanci ServiceHost jménem aplikace. Infrastruktura hostování SLUŽBY IIS a WAS nezná nic o vašem vlastním ServiceHost derivátu.

Tento ServiceHostFactory problém byl navržen tak, aby vyřešil přístup k vašemu vlastnímu ServiceHost prostředí ze služby IIS nebo WAS. Vzhledem k tomu, že vlastní hostitel odvozený z ServiceHost něj je dynamicky nakonfigurovaný a potenciálně z různých typů, hostitelské prostředí ho nikdy nekonfiguruje přímo. Místo toho WCF používá vzor továrny k poskytování vrstvy nepřímých závislostí mezi hostitelským prostředím a konkrétním typem služby. Pokud ho neřeknete jinak, použije výchozí implementaci ServiceHostFactory , která vrátí instanci ServiceHost. Můžete ale také zadat vlastní továrnu, která vrací odvozeného hostitele zadáním názvu typu CLR vaší implementace továrny v direktivě @ServiceHost .

Záměrem je, že pro základní případy by implementace vlastní továrny měla být jednoduché cvičení. Tady je například vlastní, ServiceHostFactory který vrací odvozené ServiceHosthodnoty:

public class DerivedFactory : ServiceHostFactory  
{  
   public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )  
   {  
      return new DerivedHost( t, baseAddresses )  
   }  
}  

Chcete-li použít tuto továrnu místo výchozí továrny, zadejte název typu v direktivě @ServiceHost následujícím způsobem:

<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>

I když neexistuje žádný technický limit pro provádění toho, co chcete vrátit ServiceHost z CreateServiceHost, doporučujeme zachovat implementace vaší továrny co nejjednodušší. Pokud máte spoustu vlastní logiky, je lepší tuto logiku umístit do hostitele místo do továrny, aby ji bylo možné opakovaně použít.

Existuje ještě jedna vrstva rozhraní API pro hostování, která by se zde měla zmínit. WCF také má ServiceHostBase a ServiceHostFactoryBase, ze kterého ServiceHost a ServiceHostFactory v uvedeném pořadí odvozen. Existují pro pokročilejší scénáře, kdy je nutné prohodit velké části systému metadat vlastními vlastními vytvářeními.