依赖注入的最佳实践

本文关键字:最佳 注入 依赖 | 更新日期: 2023-09-27 17:50:27

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

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

目前我在webproject中有一个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>();
    }
}

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

控制器示例代码:

Public ActionResult Get (int id)
{
    var repository = Binder.GetImplementation<IDocuments>();
    // do some stuff with the repository here
}

不确定这是否是一个好方法?

依赖注入的最佳实践

您现在看到的是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容器来解析控制器。

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

你被链接到你的Binder类的实例。它使你的类不可重用,它必须重构,因为它不是控制器的责任,以获得正确的idocdocuments实现的实例。必须有一些外部依赖解析器(例如- Ninject)必须进行构造函数注入或属性注入。