通过操作筛选器属性将实体自动映射到模型

本文关键字:映射 模型 实体 操作 筛选 属性 | 更新日期: 2024-10-21 07:49:34

本文中,Jimmy Bogard继续解释了他在进行MVC时认可的一些最佳实践。

这篇文章总体上相当不错,我发现他的建议(在其他博客文章中)也相当可靠。但是,他建议使用属性将实体映射到模型。

怎么样

[AutoMap(typeof(Product), typeof(ShowProduct))]
public ActionResult Details(int id)
{
    var product = _productRepository.GetById(id);
    return View(product);
}

比这更好的(在我看来,这对代码的实际意图来说更具声明性

public ActionResult Details(int id)
{
    var product = _productRepository.GetById(id);
    var model = Mapper.Map<Product, ShowProduct>(product);
    return View(model);
}

除此之外,似乎还有一些场景是不切实际的,比如基于输入返回不同模型的操作方法,或者更简单的场景,比如

    [HttpGet]
    public ActionResult Index()
    {
        return List();
    }
    public ActionResult Until(long id) // "id" is the timestamp
    {
        return List(id);
    }
    [NonAction]
    internal ActionResult List(long? timestamp = null, int count = 8)
    {
        IEnumerable<Post> posts = postService.GetLatest(timestamp, count);
        PostListModel model = mapper.Map<IEnumerable<Post>, PostListModel>(posts);
        return ContextView("List", model);
    }

这实际上是一种好的做法,还是不合理的,是对一开始就很简单的代码的无端混淆?

我问这个问题是出于无知,而不是亲自攻击一个我认为很棒的博主,而且我已经喜欢AutoMapper了。

通过操作筛选器属性将实体自动映射到模型

我正在搜索这个主题,还浏览了Los Techies的帖子。我的下一次搜索在AutoMapper用户组中找到了这篇谷歌群组文章。

看起来吉米已经放弃了这个指导:

不要使用动作筛选器。我们最初自己也走这条路,但最终还是选择了自定义操作结果。有点更容易自定义那些超操作过滤器,这使得它非常漂亮向提供自定义行为是不可能的

HTH,

Jimmy

我的想法是,将映射放在控制器操作上更好,因为它可以隐藏实际映射实现的一些细节。与在7+操作方法中更改此调用相比,您还可以获得额外的灵活性,以便稍后在一个文件中更改映射。这假设了一个纯粹的基本CRUD操作。可能有一些特殊的用例不起作用,在这些情况下做一些不同的事情对我来说很好

那只是我的2美分。