c# - 在 AutoMapper 中使用上下文值进行投影

标签 c# automapper automapper-2

我目前正在评估 AutoMapper 是否对我们的项目有益。我正在使用 ASP.NET Web API 开发 RESTful Web API,我必须返回的内容之一是包含链接的资源。考虑这个使用以下域对象的简化示例:

public class Customer
{
    public string Name { get; set; }
}

我需要将其映射到一个资源对象中,有点像 DTO,但添加了一些属性以促进 REST。这就是我的资源对象的样子:

public class CustomerResource
{
    public string Name { get; set; }
    public Dictionary<string, string> Links { get; set; }
}

Links 属性需要包含指向相关资源的链接。现在,我可以使用以下方法构建它们:

public IEnumerable<CustomerResource> Get()
{
    Func<Customer, CustomerResource> map = customer => 
        new CustomerResource
        {
            Name = customer.Name,
            Links = new Dictionary<string, string>()
            {
                {"self", Url.Link("DefaultApi", new { controller = "Customers", name = customer.Name })}
            }
        }

    var customers = Repository.GetAll();
    return customers.Select(map);
}

...但这很乏味,而且我有很多嵌套资源等等。我看到的问题是我无法使用 AutoMapper,因为它不允许我提供投影期间所需的某些东西,这些东西的范围限定为执行映射操作的点。在这种情况下,ApiController 的 Url 属性提供了我需要为我创建链接的 UrlHelper 实例,但可能还有其他情况。

你会如何解决这个难题?

附言我专门针对这个问题输入了这段代码,它在你的脑海中编译,但在你最喜欢的 IDE 中可能会失败。

最佳答案

这不是一个很好的解决方案,但在通读了文档之后,似乎没有一个...我们目前正在通过映射 Tuple<TDomainType, TContextStuff> 来加入上下文内容。至 TDataTransfer .所以在你的情况下你会Mapper.CreateMap<Tuple<Customer, Controller>, CustomerResource> .

不漂亮,但它有效。

关于c# - 在 AutoMapper 中使用上下文值进行投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15766427/

相关文章:

c# - 下拉菜单的自动映射器映射 IEnumerable<SelectListItem>

c# - AutoMapping : Dereference of a possibly null reference? Null 条件运算符不适用于 AutoMapping

c# - AutoMapper - 为什么要覆盖整个对象?

c# - 使用键将列表映射到 Automapper 中的现有列表

c# - MVC4 WebApi 进程启动器

c# - EF6 延迟加载不起作用,而急切加载工作正常

c# - 使用linq和automapper在dto中将属性序列化为复杂类型

c# - 使用自动映射器将一个源类映射到多个派生类

c# - asp.net 工具提示对于里面的文本来说显得很大

c# - C#中,多个容器中的同一个字符串是否指向同一个位置