Когда вам нужна агрегированная служба (как это называется в документации Autofac), это может быть признаком нарушения принципа единой ответственности , который гласит, что класс должен выполнять одну вещь и только одну вещь .
Другими словами, шаблон Aggregate Service - это кодовый запах *.
Наличие больших базовых классов также является запахом кода , поскольку базовые классы имеют тенденцию к росту и превращаются в большие и сложные классы, которые содержат много кода, который используют не все подтипы. Вместо этого, общий совет заключается в том, чтобы отдать предпочтение композиции перед наследованием .
Однако с такими инфраструктурами пользовательского интерфейса, как ASP.NET MVC, это не всегда легко, поскольку большинство самих сред поддерживают наследование.
Попробуйте извлечь логику базового класса для разделения зависимостей, особенно когда этот код в базовом классе используется не всеми подтипами. Например, вы можете изменить метод RedirectToDefaultPage
на следующий:
public class DefaultPageRedirector
{
private readonly ICookieService cookieService;
public DefaultPageRedirector(ICookieService cookieService)
{
this.cookieService = cookieService;
}
public ActionResult RedirectToDefaultPage(
Controller controller)
{
var page = this.cookieService.GetDefaultPageCookie(
controller.Request, controller.RouteData);
//Do Something
}
}
Таким образом, вы можете вводить DefaultPageRedirector
только в Controller
типы, которые действительно нуждаются в этом.
Для OnActionExecuting
он отличается, так как он вызывается для каждого подтипа. Однако свойство ViewData["UserName"]
, вероятно, будет использоваться не всеми View
в системе, и в этом случае вам следует рассмотреть возможность возврата UserName
как части (статически типизированного) объекта ViewModel
. Если он используется большинством представлений, вы можете рассмотреть возможность использования частичного представления, поскольку в ваших представлениях может быть повторяющийся код (принцип DRY действует не только для кода, но и для каждой части в система).
Это, вероятно, избавит от большей части кода в базовом классе, что, вероятно, также удалит большинство зависимостей в базе (если не все).
* Обратите внимание, что запах кода не означает, что всегда проблема. Процитируем Википедию: «Запах кода - это любой признак в исходном коде программы, который , возможно, указывает на более серьезную проблему».