Windows Communication Foundation (WCF) 中裝載服務的標準 ServiceHost API 是 WCF 架構中的擴充點。 使用者通常可以從 ServiceHost 衍生自己的主機類別,通常是為了覆寫 OnOpening(),以便在開啟服務之前,使用 ServiceDescription 來新增預設端點或修改行為。
在自行托管環境中,您不需要建立自定義 ServiceHost,因為您撰寫具現化主機的程式碼,然後在具現化之後呼叫 Open()。 在這兩個步驟之間,您可以執行任何您想要的步驟。 例如,您可以新增 IServiceBehavior:
public static void Main()
{
ServiceHost host = new ServiceHost( typeof( MyService ) );
host.Description.Add( new MyServiceBehavior() );
host.Open();
...
}
此方法無法重複使用。 作描述的程式代碼會編碼成主機程式 (在此案例中為 Main() 函式),因此很難在其他內容中重複使用該邏輯。 除了命令式程序代碼之外,還有其他方法可以新增 IServiceBehavior 。 您可以從 ServiceBehaviorAttribute 衍生屬性,並將該屬性放在您的服務實作類型上,或者您可以讓自定義行為可設定,並使用組態動態撰寫。
不過,此範例的稍微變化也可以用來解決此問題。 其中一種方法是將加入 ServiceBehavior 的程式代碼移出 Main()
,並移入 OnOpening 的自定義衍生方法 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()
中使用:
public static void Main()
{
ServiceHost host = new DerivedHost( typeof( MyService ) );
host.Open();
...
}
現在您已將自定義邏輯封裝成全新的抽象概念,可在許多不同的主機可執行檔之間輕鬆重複使用。
目前還不清楚如何從 Internet Information Services (IIS) 或 Windows 進程啟用服務 (WAS) 內部使用此自定義 ServiceHost 。 這些環境與自我裝載環境不同,因為裝載環境是代表應用程式具現化的 ServiceHost 環境。 IIS 和 WAS 裝載基礎結構並不知道您的自定義 ServiceHost 衍生品。
ServiceHostFactory的設計目的是要解決從 IIS 或 WAS 存取自定義ServiceHost的問題。 因為衍生自 ServiceHost 的自定義主機是動態設定的,而且可能是各種類型,所以裝載環境永遠不會直接具現化它。 相反地,WCF 使用工廠模式,在裝載環境與服務的具體類型之間提供一層間接層。 除非另有指示,否則它會使用ServiceHostFactory的默認實作,以傳回ServiceHost的實例。 但是您也可以提供您自己的工廠,藉由在@ServiceHost指令中指定您工廠實作的CLR類型名稱,以便返回您衍生的主機。
目的是針對基本情況,實作您自己的工廠應該是一個簡單的工作。 例如,這是一個自訂的ServiceHostFactory,它傳回衍生的ServiceHost:
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new DerivedHost( t, baseAddresses )
}
}
若要使用此處理站,而不是預設處理站,請在 指示詞中 @ServiceHost 提供類型名稱,如下所示:
<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>
雖然對從 ServiceHost 傳回的 CreateServiceHost 進行任何操作沒有技術上的限制,但建議您儘可能簡化工廠的實作。 如果您有許多自定義邏輯,最好將該邏輯放在主機內部,而不是放在處理站內,使其可重複使用。
托管 API 還有一層,應該在這裡提及。 WCF 也有 ServiceHostBase 和 ServiceHostFactoryBase,ServiceHost 和 ServiceHostFactory 分別由它們衍生而來。 這些情境適用於更進階的場合,此時您需要將大部分的元數據系統替換成您自己設計的自定義創作。