【问题标题】:Get an instance of an object with Ninject使用 Ninject 获取对象的实例
【发布时间】:2011-10-10 20:08:51
【问题描述】:

我通过 Nuget 在我的项目 Ninject.MVC3 上安装。

我读到this article 说要在我的控制器中注入依赖项,您所要做的就是安装 Ninject,在 NinjectMVC3.cs 中添加我的依赖项并准备好。

到目前为止一切顺利,但是如何检索对象的实例?

public ActionResult MyAction()
{
    var myObject = /* HERE  ??*/
}

在控制器的构造函数中我没有问题!

public class AccountController : Controller
{
    public AccountController(IRepository repository) { ... } //This works!!
}

【问题讨论】:

    标签: asp.net-mvc-3 dependency-injection ninject


    【解决方案1】:

    之所以起作用,是因为 ControllerFactory 会寻找 DI 并自动添加它。如果你想得到一个特定的实例,你可以这样做:

    private static void RegisterServices(IKernel kernel) {
        kernel.Bind<ICoolObject>().To(CoolObject);
    }
    
    public ActionResult MyAction() {
        var myObject = 
            System.Web.Mvc.DependencyResolver.Current.GetService(typeof (ICoolObject));
    }
    

    不过要小心。依赖注入的新手(包括我自己)经常这样做。问题是为什么你需要这样做?

    【讨论】:

    • 不不,我明白了。我想要的是检索一个对象的实例。我到了这一点:new StandardKernel().Get&lt;IRepository&gt;(); 这是正确的吗?
    • 好吧,您应该将IRepository 放入控制器的构造函数中。但是我不会创建一个新的StandardKernel,因为已经为您构建了一个并且可以在System.Web...Current
    • 我明白 .. 这就是我想要的,但是代码被咬了 .. System.Web ..... 当前?如何恢复当前的内核 Ninject?
    • 我把它删掉了,因为它是我答案中的代码。 System.Web.Mvc.DependencyResolver.Current 为您提供当前的 Ninject 内核。然后你调用GetService来获取你想要解析的特定类型。
    • 或者更简洁,可以DependencyResolver.Current.GetService&lt;ICoolObject&gt;();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多