C# ASP.NET MVC和web中的Ninject
在ASP.NET MVC应用程序中使用Ninject时,您的网站上的并发用户是否共享内核?有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样C# ASP.NET MVC和web中的Ninject,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,在ASP.NET MVC应用程序中使用Ninject时,您的网站上的并发用户是否共享内核?有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样 if (user == "A") kernel.Bind<IFoo>().To<FooForA>(); else kernel.Bind<IFoo>().To<FooForB>(); if(用户==“A”) kernel.Bind().To();
if (user == "A")
kernel.Bind<IFoo>().To<FooForA>();
else
kernel.Bind<IFoo>().To<FooForB>();
if(用户==“A”)
kernel.Bind().To();
其他的
kernel.Bind().To();
没有冲突
您网站上的并发用户是否共享内核
在典型的(推荐的)设置中,每个AppDomain都有一个内核的实例。这意味着每个请求(以及每个用户)都访问相同的内核
实例(可能是并行的)
有没有可能创建一个条件绑定,这样不同的用户就可以得到相同接口的不同具体实现,就像这样
if (user == "A")
kernel.Bind<IFoo>().To<FooForA>();
else
kernel.Bind<IFoo>().To<FooForB>();
不建议基于运行时数据构建对象图(您的user==“A”
是基于运行时数据user
的决策)。这暴露了与以下情况相同的缺点:
它会导致歧义,使组合根复杂化,并承担额外的责任,并且使验证DI配置的正确性变得异常困难
相反,建议是:
让运行时数据通过构造的对象图的方法调用流动
通过为IFoo
引入一个代理,根据运行时数据将任何传入呼叫转发给FooForA
或foofrob
,您可以简单而优雅地实现这一点。例如:
public sealed class FooSelectorProxy : IFoo
{
private readonly FooForA afoo;
private readonly FooForB bfoo;
public FooSelectorProxy(FooForA afoo, FooForB bfoo) {
this.afoo = afoo;
this.bfoo = bfoo;
}
public object FooMethod(object args) {
return CurrentFoo.FooMethod(args);
}
private IFoo CurrentFoo {
get { return user == "A" ? this.afoo : this.bfoo; }
}
}
使用此FooSelectorProxy
,您可以进行以下注册:
kernel.Bind<IFoo>().To<FooSelectorProxy>();
kernel.Bind().To();
这将推迟执行if(user==“A”)
代码,直到构建对象图之后,直到运行时数据可用。回答得很好。非常感谢你的帮助。