2012-01-13 17 views
0

あなたはリクエストホストの値に基づいていくつかのクラスを注入しますか?私はNinject経由でNinject MVC3ライブラリをインストールしました。ASP.NET MVC3条件付き注入

private static void RegisterServices(IKernel kernel) 
{ 
    var host = get host from request; 

    if (host.StartstWith("x.")) 
    { 
     kernel.Bind<IMyInterface>().To<XImplementation>().InRequestScope(); 
    } 
    else if (host.StartstWith("y.")) 
    { 
     kernel.Bind<IMyInterface>().To<YImplementation>().InRequestScope(); 
    } 
} 

編集:私はこのような何かを探していますちょうど工場以外の方法がある。.. this answerを見つけましたか?上記の "疑似"の例のように?

ソリューション:

private static void RegisterServices(IKernel kernel) 
{ 
    var host = HttpContext.Current.Request.Headers["host"].ToLower(); 

    kernel.Bind<IMyInterface>().To<XImplementation>().When(ctx => host.StartsWith("x.")).InRequestScope(); 
    kernel.Bind<IMyInterface>().To<YImplementation>().When(ctx => host.StartsWith("y.")).InRequestScope(); 
} 
+0

をv2のないV1参照します。 Search Mark Seemann RRRパターン –

+0

条件付き構成が不十分な場合、ToMethod、ToProviderを使用するか、独自のファクトリを構築できます。一般的に、条件付きのアプローチはあなたの最初のコールポートでなければなりません - @Simon Halseyの答え –

+0

@RubenBartelinkを削除した場合、.InRequestScope()と組み合わせてToを使用すると何が間違っていますか?より良いホエー工場を使用していますか?それはなぜそうなのですか? – redman

答えて

1

は、この方法を試してみてください。

Bind<IMyInterface>().To<XImplementation>().When(ctx => host.StartstWith("x.")).InRequestScope(); 
Bind<IMyInterface>().To<YImplementation>().When(ctx => host.StartstWith("y.")).InRequestScope(); 
+0

慎重に、あなたは実質的にバインディングの寿命の定数である 'host'を使用する際に問題のエラーを伝えました。 –