2

这篇文章中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。

4

2 回答 2

2

我正在对这个主题进行搜索,并且还看到了 Los Techies 的帖子。我的下一次搜索导致 AutoMapper-users 组中的这篇Google Groups 文章

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

不要使用动作过滤器。我们最初是自己走的那条路,但最终还是选择了自定义操作结果。自定义那些 over action 过滤器要容易一些,这使得提供自定义行为几乎是不可能的。

高温下,

吉米

于 2014-04-02T18:03:10.973 回答
1

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

那只是我的2美分。

于 2012-10-12T13:44:19.743 回答