具有依赖注入的基本控制器的设计模式 - MVC 3 + Ninject

Sig*_*nza 5 c# design-patterns dependency-injection inversion-of-control asp.net-mvc-3

我有这个图案

public abstract class BaseController : Controller
{
    readonly RepositoryFactory _rep;
    protected RepositoryFactory rep
    {
        get
        {
            return _rep;
        }
    }

    readonly ManageRoles _man;

    readonly ElementAvailableForUser _env;
    protected ElementAvailableForUser env
    {
        get
        {
            return _env;
        }
    }

    public BaseController()
      : this(DependencyResolver.Current.GetService<RepositoryFactory>(),
             DependencyResolver.Current.GetService<ManageRoles>(),
             DependencyResolver.Current.GetService<ElementAvailableForUser>()) { }

    public BaseController(RepositoryFactory rep, ManageRoles man, ElementAvailableForUser env)
    {
        _rep = rep;
        _man = man;
        _env = env;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以做这样的事情

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View(rep.Offers.GetAll());
    }

    public ActionResult Sections()
    {
        return View(env);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我所有的控制器中。我确定这是 DI 和 IoC 的反模式,所以我精简了这样的解决方案

public abstract class BaseController : Controller
{
    ...

    // removed empty constructor

    public BaseController(RepositoryFactory rep, ManageRoles man, ElementAvailableForUser env)
    {
        _rep = rep;
        _man = man;
        _env = env;
    }
}

public class HomeController : BaseController
{
    public HomeController(RepositoryFactory rep, ManageRoles man, ElementAvailableForUser env) : base(rep, man, env) { }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案要求我在所有控制器中插入所有依赖项并更新所有构造函数,如果我需要一个新的全局变量(如 rep)或一个新的 basecontroller 私有变量(如 man)。

我应该遵循哪种模式,为什么?

编辑 我发现这个问题,而这个,但我仍然无法理解其设计模式,我应该遵循。

Gar*_*y.S 0

我认为使用精简解决方案您不需要总是声明rep、man 和env。您可以利用默认/可选参数。

public BaseController(RepositoryFactory rep = null, ManageRoles man = null, ElementAvailableForUser env = null)
{
    _rep = rep;
    _man = man;
    _env = env;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用命名参数分配:

public class HomeController : BaseController
{
    public HomeController(ManageRoles man) : base(man: man) { }

    ...
}
Run Code Online (Sandbox Code Playgroud)