【发布时间】:2011-06-10 18:13:41
【问题描述】:
我觉得这应该是一个常见的要求,但我无法以正确的方式进行操作。我目前有一个标准的 MVC3 站点,它使用 Ninject 将项目 A 中的服务类(在单例范围内)注入到控制器的构造函数中 - 这一切都很好。
我有另一个类库 - 项目 B - 它需要来自项目 A 的类。我想要做的是注入我在项目 B 类的 MVC 项目中使用的同一个单例实例。这可能吗?
目前在 global.asax 中,我有这个用于设置绑定。
private void SetupDependencyInjection()
{
// Create Ninject DI kernel
IKernel kernel = new StandardKernel();
kernel.Bind<IRepositoryA>().As<RepositoryA>().InSingletonScope();
// A load more binding go here...
// Tell ASP.NET MVC 3 to use our Ninject DI Container
DependencyResolver.SetResolver(new NinjectResolver(kernel));
}
在我的控制器中,我有类似的东西
public ExampleController(IRepositoryA iRepositoryA, more params....)
{
this.iRepositoryA= iRepositoryA;
var ProjectB.Class1 = new ProjectB.Class1(this.iRepositoryA);
// more setup of params here....
}
我在 ProjectB 中有两个类,看起来像这样
public class Class1
{
public Class1(IRepositoryA iRepositoryA, more params...)
{
var class2 = new Class2(iRepositoryA, more params...);
}
}
public class Class2
{
public Class2(IRepositoryA iRepositoryA, more params...)
{
// Something goes here....
}
}
我要做的是实例化 ProjectB.Class1 的新实例,而不必将 iClass(可能还有更多负载)作为参数传递。我相信我可以从全局 asax 中公开 IKernel,然后执行 iKernel.Get() 之类的操作。这是最好的方法吗?我看到的另一个问题是注入控制器的参数可能会下降 3 个或更多级别,例如像上面的例子,但继续到 Class2。在这种情况下,是否最好继续沿链向下传递参数?
【问题讨论】:
-
如果ProjectB.Class1直接给AuditController传一个实例不是更好吗?
-
对不起,你指出了我的例子中的一个缺陷——我会修改。
-
您需要提示吗?
-
好的,我认为这是更新的。对不起,如果这没有意义,我对最好的方法有点困惑。
标签: c# asp.net asp.net-mvc ninject