将依赖注入控制器构造函数或使用属性

时间:2018-04-03 06:58:41

标签: c# asp.net-mvc dependency-injection repository

在我们的代码库中有一个基本控制器和一个派生控制器。在调用BaseController的基本控制器中,使用如下所示的属性注入依赖项。

private IAuditRepository _audit;

protected IAuditRepository Audit
{
    get { return _audit ?? (_audit = DependencyResolver.Current.GetService<IAuditRepository>()); }
}

继承基本控制器的派生控制器也被多个控制器继承。让我们说这个派生的控制器叫做BaseProjectController。这个控制器有一个ProjectRepository所以不是遵循BaseController中给出的相同方法,代码的原始作者在构造函数中注入了这个存储库,如下所示。

private IProjectRepository _projectRepository;
protected BaseProjectController(IProjectRepository projectRepository)
{
    _projectRepository = projectRepository;
}

因此,与Project相关的任何控制器都将继承BaseProjectController,并且每个控制器都需要实现类似的代码段。

public class ProjectActivityController : BaseProjectController
{
    public ProjectActivity(IProjectRepository projectRespository)
     :base(projectRespository) { }
}

我发现使用第一种方法很容易,只需从继承BaseProjectController的控制器调用属性,而不需要在构造函数中注入它。

问题是为什么这种方法可以在BaseController中遵循相同的方法?两者有什么区别?为什么你会选择第一种方法而不是第二种方法 - 反之亦然?

1 个答案:

答案 0 :(得分:2)

我可以描述这两种方法的优缺点,所以,你自己决定。

构造函数注入

优点:

  1. 您在一个地方看到所有依赖项
  2. 没有Service Locator反模式 - 您的代码不依赖于特定容器(DependencyResolver)
  3. 缺点:

    1. 您应该将所有依赖项从子类传递给基类(要编写更多代码)
    2. 物业注射

      反之亦然:)

      因此,比较利弊并作出决定。