如何在不使用mvc3中的构造函数模式的情况下从ninject获取资源

Rus*_*ova 1 c# asp.net-mvc ninject inversion-of-control asp.net-mvc-3

当使用Ninject和mvc3时,我们会做类似的事情,安装ninject,registerger modules-or-services.

我们写这样的控制

public class HomeController : Controller
{
    private IHelloService _service;
    public HomeController(IHelloService service)
    {
        _service = service;
    }

    public string Index()
    {
        return _service.GetGreeting();
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做点什么

public class HomeController : Controller
{
    private IHelloService _service;

    /*
          No default constructor
    */

    public string Index()
    {
        _service= Ask_Ninject_to_provide_resource
        return _service.GetGreeting();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您目前编写控件的做法比您提出的要好.您希望能够通过字段而不是构造函数注入.这是一个坏主意,不建议这样做.

引自Ninject wiki:

"虽然它的简单性很诱人,但你通常应该尽量避免使用字段注入,因为这个值只能通过Ninject来设置.这使得单元测试变得更加复杂,因为有时最简单的方法就是手动使用依赖注入来注入模拟对象进入你的单元测试.(Ninject的单元测试将在以后更深入地介绍.)"

替代方案是通过属性注入,但是再一次,你必须有一个很好的理由这样做.大多数时候构造函数注入应该完成这项工作.


Bui*_*ted 5

public class HomeController : Controller
{
    private IHelloService _service;

    /*
          No default constructor
    */

    public string Index()
    {
        _service= DependencyResolver.Current.GetService<IHelloService>();
        return _service.GetGreeting();
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我会严肃质疑这样做的必要性.