对MVC中的大量类/控制器的依赖注入

时间:2016-05-29 06:58:29

标签: .net asp.net-mvc dependency-injection inversion-of-control autofac

我正在使用ASP.Net MVC项目,我使用Autofac进行依赖注入实现。

我为业务层创建Managers类,为数据库层创建Repository类。

我创建了带有重载构造函数的BaseController类,用于Autofac依赖注入。

BaseController //用于授权和常见操作

public class BaseController : Controller
{
   protected readonly IManager_A _manager_A;
   protected readonly IManager_B _manager_B;

   public BaseController()
   {}
   public BaseController(IManager_A manager_A)
   {
       this._manager_A = manager_A;
   }
   public BaseController(IManager_B manager_B)
   {
       this._manager_B = manager_B;
   }
   public BaseController(IManager_A manager_A, IManager_B manager_B)
   {
       this._manager_A = manager_A;
       this._manager_B = manager_B;
   }
}

控制器A

public class Controller_A : BaseController
{
    public Controller_A(IManager_A manager_A)
              :base(manager_A)
    {}
}

控制器B

public class Controller_B : BaseController
{
    public Controller_B(IManager_B manager_B)
              :base(manager_B)
    {}
}

控制器A_B

public class Controller_A_B : BaseController
{
    public Controller_A_B(IManager_A manager_A,IManager_B manager_B)
              :base(manager_A,manager_B)
    {}
}

假设我有数百个Managers类,并且每个控制器都使用自己的管理器实例,使用这种方法我必须为将在控制器中使用的每个管理器实例创建重载的构造函数。在某些控制器中,我需要使用超过5个Manager实例,我认为这是设计错误的标志

如何在不为BaseController创建大量构造函数的情况下使用Autofac创建依赖注入?

修改 我从BaseController删除了重载的构造函数,因为我没有在内部使用Manager实例。我的代码控制器变成了

BaseController

public class BaseController : Controller
{
   public BaseController()
   {}
   // code for common action (error handling and authorization)
} 

控制器A

public class Controller_A : BaseController
{
    private readonly IManager_A _Manger_A;
    public Controller_A(IManager_A manager_A)
              :base()
    {
       this._Manger_A = manager_A;
    }
}

控制器B

public class Controller_B : BaseController
{
    private readonly IManager_B _Manger_B;
    public Controller_B(IManager_B manager_B)
              :base()
    {
       this._Manger_B = manager_B;
    }
}

控制器A_B

public class Controller_A_B : BaseController
{
    private readonly IManager_A _Manger_A;
    private readonly IManager_B _Manger_B;

    public Controller_A_B(IManager_A manager_A, IManager_B manager_B)
              :base()
    {
       this._Manger_A = manager_A;
       this._Manger_B = manager_B;
    }
}

但是控制器仍然存在问题,这些控制器将使用许多Manager实例,其中控制器构造函数包含许多参数!!!

0 个答案:

没有答案