我目前正在評估AutoMapper是否對我們的項目有利。我正在使用ASP.NET Web API處理RESTful Web API,並且我必須返回的其中一個內容是包含鏈接的資源。考慮這個簡單的例子,使用下面的域對象:在AutoMapper中使用上下文值的投影
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實例,我需要爲我創建鏈接,但也可能有其他情況。
你會如何解決這個難題?
P.S.我專門爲這個問題輸入了這段代碼,它編譯在你的頭上,但可能會在你最喜歡的IDE中失敗。
目前我傾向於在呼叫地點創建地圖,但我不知道這是個好主意。 –
何時定義鏈接?在運行期間? – carlpett
更確切地說,是在編譯時,1)在啓動時或3)映射/解析時定義的鏈接? – carlpett