Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否通过动作过滤器属性将实体自动映射到模型?_C#_Asp.net Mvc 3_Automapper - Fatal编程技术网

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

C# 是否通过动作过滤器属性将实体自动映射到模型?,c#,asp.net-mvc-3,automapper,C#,Asp.net Mvc 3,Automapper,在中,他继续解释了他在进行MVC时认可的一些最佳实践 这篇文章总体上相当不错,我发现他的建议(在其他博客文章中)总体上相当可靠。然而,他建议使用属性将实体映射到模型 这是怎么回事 [AutoMap(typeof(Product), typeof(ShowProduct))] public ActionResult Details(int id) { var product = _productRepository.GetById(id); return View(product)

中,他继续解释了他在进行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);
}
public ActionResult详细信息(int-id)
{
var product=\u productRepository.GetById(id);
var模型=Mapper.Map(产品);
返回视图(模型);
}
除此之外,似乎还有一些场景不太实际,例如基于输入返回不同模型的操作方法,或者更简单的场景,例如:

    [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);
    }
[HttpGet]
公共行动结果索引()
{
返回列表();
}
public ActionResult直到(长id)/“id”是时间戳
{
返回列表(id);
}
[不行动]
内部ActionResult列表(长?时间戳=null,整数计数=8)
{
IEnumerable posts=postService.GetLatest(时间戳,计数);
PostListModel=mapper.Map(posts);
返回ContextView(“列表”,模型);
}
这实际上是一种很好的实践,还是一种不合理的、毫无根据的代码混淆,而这种混淆本来就很简单


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

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


这仅仅是我的2美分。

我正在搜索这个主题,还浏览了《洛杉矶技术人员》的帖子。我的下一次搜索是在AutoMapper用户组

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

不要使用动作过滤器。我们最初是这样做的,但最终还是选择了自定义的动作结果。这有点难 更容易定制那些超动作过滤器,这使它更漂亮 很难向用户提供自定义行为

嗯,

吉米


他在这段视频中更进一步:。他创建了一个ActionResult,为您自动映射。他的控制器动作小得令人难以置信。跳到ActionResults点看看他做了什么。+1很好的问题和资源。Mapper.Map AutoMapper是功能性的,还是您的包装器?它是
AutoMapper
的引擎包装器(它仍然是可单元测试的)下面是这样一个ViewResult的实现: