9

我正在使用 MVC 4 在 ASP.net 中创建一个新项目。

我想使用Ninject. 但在我继续之前,设置依赖注入时的最佳实践是什么?

目前我在 webproject 中有一个 binder 类设置,它将引用解决方案中的数据项目。

binder类如下图所示:

 Public static class Binder
{
    static Ninject.IKernel _kernel;

    static Binder()
    {
        _kernel = new Ninject.StandardKernel();

        _kernel.Bind<IConfig>().To<AppSettingsConfig>();
        _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>();

    }

    public static T GetImplementation<T>()
    {
        return _kernel.Get<T>();
    }

}

然后在我的控制器中,我使用 GetImplementation 方法来使用确切的 require 依赖项,而不是在应用程序启动时全部注册。

来自控制器的示例代码:

Public ActionResult Get (int id)
{
    var repository = Binder.GetImplementation<IDocuments>();

    // do some stuff with the repository here
}

不确定这是否是一个好方法?任何建议都会很好。

4

3 回答 3

16

您现在拥有的是 Service Locator 反模式的示例。谷歌了解更多细节,因为它已经讨论过很多次了。

简而言之,而不是依赖服务定位器

public class SomeController 
{
  public ActionResult Get (int id)
  {
      var repository = Binder.GetImplementation<IDocuments>();

      // do some stuff with the repository here
  }
}

您应该将服务注入客户端类(依赖于构造函数注入)

public class SomeController 
{
  private IDocuments documentService { get; set; }      

  public SomeController( IDocuments documentService ) 
  {
    this.documentService = documentService;
  } 

  public ActionResult Get (int id)
  {
      var repository = documentService; 

      // do some stuff with the repository here
  }
}

在这种特定情况下,您可以设置您的控制器工厂以使用您的 IoC 容器来解析您的控制器。

于 2013-01-03T11:59:10.810 回答
4

Ninject 的最佳实践是使用 Ninject 的 MVC 扩展:https ://github.com/ninject/ninject.web.mvc/wiki/MVC3

于 2013-01-03T15:55:14.910 回答
0

您已链接到控制器内的 Binder 类的实例。它使您的类不可重用并且必须对其进行重构,因为控制器没有责任获得 IDocuments 实现的正确实例。必须有一些外部依赖解析器(例如示例 - Ninject)必须进行构造函数注入或属性注入。

于 2013-01-03T13:47:14.173 回答