かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

WCF RIA ServicesでDomainServiceの生成処理をのっとる方法

System.ServiceModel.DomainServices.Server.IDomainServiceFactoryを継承したクラスを作ります。

public class MyDomainServiceFactory : IDomainServiceFactory
{
    public DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context)
    {
        // どうにかして目的のドメインサービスを作成する
        // 引数にdomainServiceTypeで、どの型のドメインサービスを作成するかは
        // 渡ってきてるので、それを使う。
        DomainService ds = ........;
        ds.Initialize(context);
        return ds;
    }

    public void ReleaseDomainService(DomainService domainService)
    {
        // 何か、あれば解放処理
    }
}

こんなクラスを用意しておいてGlobal.asaxで以下のようにDomainServiceFactoryを差し替えてやればOKです。

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        // ファクトリの差し替え
        DomainService.Factory = new MyDomainServiceFactory ();               
    }

    // 途中省略

    protected void Application_End(object sender, EventArgs e)
    {
        // 一応後始末(必要なのかな?)
        DomainService.Factory = null; 
    }
}

これで何が出来るようになるかというと、ぱっと思いつくだけでもDomainServiceに対してMEFから依存性を注入したりといったことが出来るようになりそうです。
後は、オレオレDomainServiceの基本クラスを作って、それに応じた初期化処理を施すとか、夢ひろがりまくりんぐ。