如何将MVC的IDependencyResolver用于控制器之外的其他东西?

时间:2013-02-03 17:20:02

标签: c# asp.net-mvc-4 ninject

我创建了一个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的构造函数中,以便我可以使用链接功能,还是有其他方法?

1 个答案:

答案 0 :(得分:3)

你可以让MyObject接受另一个依赖:

class MyObject {
    MyOtherObject otherObj;
    public MyObject(IMyFirstDependency dependency, IMySecondDependency dependencyTwo) {
        otherObj = new MyOtherObject(dependencyTwo);
    }
}

现在您只需要在内核中注册此依赖项:

kernel.Bind<IMySecondDependency>().To<MyConcreteSecondDependency >();

但通常你不需要那些2个包装器对象并在它们的构造函数中做一些手动实例化(MyObjectMyOtherObject)。您可以直接使用控制器中的接口。我真的没有看到那些对象的任何意义。如果它们应该作为聚合您的存储库的一些服务类,那么很好,只需定义它们周围的抽象并让您的控制器直接使用此服务类:

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
    }

}