カスタム ServiceHost を作る場面

自己ホストの場合、ServiceHost のインスタンスを生成してから Open するまでの間に、任意の処理を挟めます。

ServiceHost host = new ServiceHost(typeof(MyService));

// サービスのメタデータを取得できるようにする
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
host.Description.Behaviors.Add(smb);

host.Open();

上記の場合、Behavior を追加する部分は汎用的な処理なので、再利用したいところです。
カスタム ServiceHost は、この汎用的な処理を再利用するための手段として作成します。

public class MyServiceHost : ServiceHost
{
    public MyServiceHost(Type serviceType, params uri[] baseaddresses)
        : base(serviceType, baseAddresses)
    {
    }

    protected override void OnOpening()
    {
        // ホストしたサービスのメタデータを取得できるようにする
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        this.Description.Behaviors.Add(smb);

        base.OnOpening();
    }
}

こうしてカプセル化しておけば、いろんなホストアプリケーションで再利用できます。

なお、作成したカスタム ServiceHost を IIS で利用する場合は、カスタム ServiceHostFactory を作成しなければいけません。