【发布时间】:2013-03-23 21:13:06
【问题描述】:
我目前正在评估 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 中可能会失败。
【问题讨论】:
-
目前我倾向于在呼叫站点创建地图,但我不知道这是否是个好主意。
-
什么时候定义链接?在运行时?
-
更准确地说,链接是在 1) 编译时、2) 在启动时还是 3) 在映射/解析时定义的?
-
Url 属性是指每个请求实例化的 UrlHelper 实例,因此在映射时。
-
我可能会完全避免使用 AutoMapper。这不适合我正在做的事情。
标签: c# automapper automapper-2