У меня есть этот шаблон
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;
}
}
так что я могу сделать что-то вроде этого
public class HomeController : BaseController
{
public ActionResult Index()
{
return View(rep.Offers.GetAll());
}
public ActionResult Sections()
{
return View(env);
}
}
во всем моем контроллере.
Я уверен, что это антипаттерн для 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) { }
...
}
но это решение требует, чтобы я вставил все зависимости во все контроллеры и обновил весь конструктор, если мне нужна новая глобальная переменная (например, rep) или новая личная переменная для basecontroller (например, man).
Какой схеме мне следовать и почему?
Редактировать
Я нашел этот вопрос и этот , но все еще не могу понять, каким шаблонам проектирования следует следовать.