通过动作过滤器属性自动将实体映射到模型?

时间:2012-08-07 01:08:23

标签: c# asp.net-mvc-3 automapper

this article 中,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了。

2 个答案:

答案 0 :(得分:2)

我正在搜索这个主题,并且还浏览了Los Techies帖子。我的下一次搜索在AutoMapper-users组中导致了这个Google Groups article

看起来Jimmy已经退出了这个指导:

  

不要使用动作过滤器。我们最初自己走了那条路,但最终决定采用自定义动作结果。它有点儿   更容易定制那些超过动作过滤器,这使它很漂亮   很难不能提供自定义行为。

     

HTH,

     

答案 1 :(得分:1)

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

那只是我的2美分。