我创建了一个NinjectDependencyResolver
类,它非常适合将依赖项注入控制器。我知道你可以链接依赖项,但我的问题是我在控制器中实例化一个类,然后实例化另一个类。第三类需要注入其他依赖项,例如:
public class MyController : Controller {
MyObject obj;
public MyController(IMyFirstDependency dependency) {
obj = new MyObject(dependency);
}
}
class MyObject {
MyOtherObject otherObj;
public MyObject(IMyFirstDependency dependency) {
otherObj = new MyOtherObject(??????);
}
}
class MyOtherObject {
public MyOtherObject(IMySecondDependency dependencyTwo)
{
// do something with dependencyTwo
}
}
注入dependencyTwo的最佳方法是什么?我是否需要将其包含在MyObject
的构造函数中,以便我可以使用链接功能,还是有其他方法?
答案 0 :(得分:3)
你可以让MyObject
接受另一个依赖:
class MyObject {
MyOtherObject otherObj;
public MyObject(IMyFirstDependency dependency, IMySecondDependency dependencyTwo) {
otherObj = new MyOtherObject(dependencyTwo);
}
}
现在您只需要在内核中注册此依赖项:
kernel.Bind<IMySecondDependency>().To<MyConcreteSecondDependency >();
但通常你不需要那些2个包装器对象并在它们的构造函数中做一些手动实例化(MyObject
和MyOtherObject
)。您可以直接使用控制器中的接口。我真的没有看到那些对象的任何意义。如果它们应该作为聚合您的存储库的一些服务类,那么很好,只需定义它们周围的抽象并让您的控制器直接使用此服务类:
public class MyController : Controller {
private readonly IMyService myService;
public MyController(IMyService myService) {
this.myService = myService;
}
public ActionResult Index() {
// you could use your service layer here with this.myService
}
}