gpt4 book ai didi

asp.net-mvc - 我们什么时候应该实现自定义 MVC ActionFilter?

转载 作者:行者123 更新时间:2023-12-01 13:00:09 25 4
gpt4 key购买 nike

我们是否应该将本应位于 Controller 中的逻辑(如渲染局部 View 的数据)移至 ActionFilter 中?

例如,我正在制作一个 CMS 网站。应该有一个广告 block 要呈现在几个页面上,但不是所有页面。我是否应该制作一个 ActionFilter 属性,如 [ShowAd(categoryId)] 并使用此属性装饰操作方法?

此 Controller 的实现将包括服务调用以从数据库中检索信息、构建 View 模型并放入 ViewData。将有一个 HtmlHelper 使用 ViewData 中的数据呈现部分 View (如果存在)。

最佳答案

我觉得这很恶心。

当我试图弄清楚是否需要 ActionFilter 时,我的第一个问题是,这是一个横切关注点吗?。乍一看,您的特定用例不适合这个。原因是,广告只是在页面上呈现的另一件事。它并没有什么特别之处,使它成为交叉领域。如果您将问题中的“广告”一词替换为“产品”,则所有相同的事实都是正确的。

就是这样,然后是关注点和可测试性的分离。一旦你有了这个 ActionFilter,你的 Controller 的可测试性如何?这是你在测试时必须模拟的其他东西,更糟糕的是你必须模拟你添加 ActionFilter 的每个 Controller 的那些依赖关系。

我问的第二个问题是,“我怎样才能以一种在我使用的平台中看起来最惯用的方式来做到这一点?”

对于这个特定的问题,它听起来像一个 RenderAction AdController 是必经之路。

原因如下:

  1. 广告是它自己的资源;它通常与页面上的任何其他内容没有紧密联系;它存在于自己的小世界中。
  2. 它有自己的数据访问策略
  3. 您真的不想在每个可以使用它的地方重复代码来生成广告(这是 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);
}
}

然后你可以有一个围绕这个设置的自定义局部 View ,并且没有必要在每个 Action (或每个 Controller )上放置一个过滤器,并且你不必尝试适合方形钉(一个 Action 过滤器)在圆孔中(动态 View )。

然后向现有页面添加广告变得非常容易:

<% Html.RenderAction("ShowAd", "Ad" new { categoryId = Model.CategoryId }); %>

关于asp.net-mvc - 我们什么时候应该实现自定义 MVC ActionFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6755731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com