2012-01-13 57 views
0

Hod根据请求主机值注入一些类吗?我通过Nuget安装了Ninject MVC3库。我在寻找这样的事情:ASP.NET MVC3 Ninject有条件注入

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

没办法,你应该每个请求进行登记。搜索Mark Seemann RRR模式 – 2012-01-15 00:32:03

+0

如果条件结构不足,可以使用ToMethod,ToProvider或构建您自己的工厂。一般来说,有条件的方法应该是你的第一停靠点 - 请参阅@Simon Halsey的回答 – 2012-01-15 00:33:58

+0

@RubenBartelink如果我删除.InRequestScope(),在使用To时还有什么问题?是使用工厂更好的乳清?如果这是为什么如此? – redman 2012-01-15 11:17:10

回答

1

尝试这种方式。

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

小心,你已经在使用'host'的问题中传播了错误,这对于绑定的生命来说实际上是一个常量。 – 2012-01-15 23:22:47