我觉得这应该是一个常见的要求,但我无法正确地做到这一点。我目前有一个标准的MVC3站点,它使用Ninject将项目A中的服务类(单例范围)注入到控制器的构造函数中 - 这一切都正常。
我有另一个类库 - 项目B - 它需要来自Project A的类。我想要做的是注入我在Project 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。在这种情况下,最好不要将参数传递到链中吗?
答案 0 :(得分:4)
您的控制器需要一个Class1
实例,而不是IRepositoryA
,因此解决方案是在控制器的构造函数中需要Class1
实例:
public ExampleController(Class1 class1) {
this.class1 = class1;
}
// Let Ninject provide these dependencies!
public Class1(IRepositoryA repositoryA, Dependency2 dependency2) {
this.repositoyA = classB;
this.dependency2 = dependency2;
}