Мне это просто кажется противным.
Когда я пытаюсь выяснить, нужен ли мне ActionFilter, первый вопрос, который у меня возникает, Это сквозная проблема? . Ваш конкретный вариант использования не подходит для этого, на первый взгляд. Причина в том, что реклама - это просто еще одна вещь, отображаемая на странице. В этом нет ничего особенного, что делает его сквозным. Если вы замените слово «Объявление» на «Продукт» в вашем вопросе, все те же факты будут правдой.
Итак, есть и разделение интересов и тестируемость. Насколько проверяемы ваши контроллеры, когда вы установили этот ActionFilter
? Это что-то еще, что вы должны смоделировать при тестировании, и что еще хуже, вы должны смоделировать эти зависимости с каждым контроллером, к которому вы добавляете ActionFilter
.
Второй вопрос, который я задаю: «Как я могу сделать это таким образом, который кажется наиболее идиоматичным на платформе, которую я использую?»
Для этой конкретной проблемы это звучит как RenderAction , и AdController - это то, что нужно.
И вот почему:
- Объявление - это собственный ресурс; обычно он не привязан ни к чему другому на странице; он существует как бы в своем маленьком мире.
- У него своя собственная стратегия доступа к данным
- Вы на самом деле не хотите повторять код, чтобы генерировать объявление в каждом месте, где вы можете его использовать (вот куда вам может подойти
RenderPartial
подход)
Так вот как будет выглядеть такой зверь:
public AdController : Controller
{
//DI'd in
private AdRepository AdRepository;
[ChildActionOnly]
public ActionResult ShowAd(int categoryId)
{
Ad ad = Adrepository.GetAdByCategory(categoryId);
AdViewModel avm = new AdViewModel(ad);
return View(avm);
}
}
Тогда вы могли бы иметь собственный частичный вид, который настроен вокруг этого, и нет необходимости устанавливать фильтр на каждое действие (или каждый контроллер), и вам не нужно пытаться установить квадратный колышек (действие фильтр) в круглое отверстие (динамический вид).
Добавление объявления на существующую страницу становится очень простым:
<% Html.RenderAction("ShowAd", "Ad" new { categoryId = Model.CategoryId }); %>