MVC + Web API中的依赖注入,没有控制器构造函数中的存储库接口

时间:2014-03-10 12:19:11

标签: asp.net-mvc dependency-injection simple-injector

我将在使用WebAPI.2的MVC.5应用程序中使用SimpleInjector

MVC控制器的某些方法将为CRUD操作创建存储库对象。 Internet上的常见方法是MVC控制器中存储库的使用接口,如:     

public class DashboardController : Controller
{
    private readonly IDashboardRepository _repository;

    public DashboardController (IDashboardRepository repository) {
        _repository = repository;
    }

    [HttpPost]
    public JsonData GetInfo()
    {
        return _repository.GetInfo();
    }
...

建议WebAPI使用类似的方法

但是我不想将IDashboardRepository传递给控制器​​的构造函数,原因如下:我确信我永远不会模拟存储库的实现。我不需要单独的存储库公共接口(当前代码库没有这些接口,我需要更改大量文件来添加它们。)

我的存储库看起来像:     

public class DashboardFunc : BaseFunc
{
    public DashboardFunc(IApplicationStateProvider sp) :
        base (sp)
    {
    }

    public DashBoardData GetInfo()
    {
        ...

我想在MVC的控制器中使用这样的代码:     

public class DashboardController:Controller     {

    public DashboardController () {
    }

    [HttpPost]
    public JsonData GetInfo()
    {
        DashboardFunc dashBoard = Global.MvcContainer.GetInstance<DashboardFunc>();
        return Common.ToJson(dashBoard.GetInfo());
    }

我想要的WebAPI控制器方法。唯一的区别是     DashboardFunc dashBoard = Global.WebApiContainer.GetInstance();

我的修改(不使用控制器中的存储库接口)标准方法可以吗?未来是否会出现可能导致架构变更的潜在问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

防止回拨Global.MvcContainer.GetInstance或任何其他形式的Service Location anti-pattern。即使您不想测试该代码,也有很多缺点。使用它的缺点是(除其他外):

  • 您失去了容器为您更改给定实现的能力;它会降低您的应用灵活性。
  • 您无法为容器diagnose找到完整的对象图。
  • 您在应用启动或使用集成测试期间失去verify the configuration的能力。
  • 只是通过查看一行代码(构造函数),您就无法发现所有类的依赖项。

所以即使你不需要那个接口,我也会建议仍然使用构造函数注入并执行以下操作:

public class DashboardController : Controller {
    private readonly DashboardFunc dashboard;
    public DashboardController(DashboardFunc dashboard) {
        this.dashboard = dashboard;
    }

    [HttpPost]
    public JsonData GetInfo() {
        return Common.ToJson(this.dashBoard.GetInfo());
    }
}