Я использую MVC 3. Предположим, у меня есть базовый контроллер и несколько производных контроллеров. Я использую IoC и мой базовый конструктор контроллер выглядит следующим образом:MVC3 с IoC: слишком много параметров в базовом контроллере. Любая альтернатива?
private readonly ICacheProvider _cacheProvider;
private readonly ILoggerProvider _loggerProvider
private readonly IAuditProvider _auditProvider
public abstract class MyControllerBase : Controller
{
protected MyControllerBase(ICacheProvider cacheProvider, ILoggerProvider loggerProvider, IAuditProvider auditProvider, ...)
{
_cacheProvider = cacheProvider;
_loggerProvider = loggerProvider;
_auditProvider = auditProvider;
...
}
}
До сих пор так хорошо? Может быть. Однако каждый из моих полученных контроллеров необходимо определить конструктор, который соответствует конструктор подписи базового класса, например:
public class MyDerivedController1 : MyControllerBase
{
public MyDerivedController1(ICacheProvider cacheProvider, ILoggerProvider loggerProvider, IAuditProvider auditProvider, ...)
: base(cacheProvider, loggerProvider, auditProvider, ...)
{ }
}
И это моя проблема, потому что я должен поддерживать «многословный» конструктор во всех моих производных контроллеров. Если мне нужно добавить нового провайдера, я должен реорганизовать все мои производные контроллеры.
Я думал, что я хотел бы создать ServiceProvider (или Услугу Локатор?) Класс (и интерфейс IServiceProvider), который будет иметь конструктор и все провайдер в качестве параметров (где IoC будет выполнять свою работу) и выставить их в качестве свойств. Тогда мой базовый конструктор и производные конструкторы будут иметь только IServiceProvider в качестве параметра.
Однако я обеспокоен тем, что этот подход будет иметь некоторые отрицательные воздействия, например: 1- Скрытая реализация: я не знаю, какой провайдер я использую или нуждаюсь, если не проверю реализацию. 2- Трудно проверить: когда конструктор содержит параметры, я могу легко его протестировать, и я знаю, чего ожидать (автоматически задокументировано).
Есть ли у кого-нибудь предложения или комментарии?
Что именно делает «MyControllerBase»? Будет ли образец декоратора альтернативой? –
@ Daniel, MyControllerBase содержит несколько вспомогательных методов (как-то расширяя базовый класс контроллера MVC), содержит настраиваемый атрибут Authorize и другие атрибуты и другие методы, используемые для входа в пользовательские данные, проверьте, должна ли отображаться страница условий и условий и т. Д. – AndreCruz
Это сообщение в блоге мне немного помогло, но оно применяется только тогда, когда вы можете собрать общее поведение или группу более одного провайдера вместе. Что, если в моем случае у меня есть 5 или более поставщиков, которые мне нужны в моем Контролере с совершенно разными обязанностями? http://blog.ploeh.dk/2010/02/02/RefactoringtoAggregateServices/ – AndreCruz