Attualmente sto valutando se AutoMapper può essere di beneficio per il nostro progetto. Sto lavorando su un'API Web RESTful utilizzando l'API Web ASP.NET e una delle cose che devo restituire è una risorsa che contiene collegamenti. Considerate questo esempio semplificato, utilizzando il seguente oggetto di dominio:Proiezione utilizzando valori contestuali in AutoMapper
public class Customer
{
public string Name { get; set; }
}
ho bisogno di mappare questo in un oggetto risorsa, come una sorta di DTO, ma con proprietà aggiunti per facilitare REST. Ecco come può essere il mio oggetto risorsa:
public class CustomerResource
{
public string Name { get; set; }
public Dictionary<string, string> Links { get; set; }
}
La proprietà Collegamenti dovrà contenere collegamenti a risorse correlate. In questo momento, ho potuto costruirli utilizzando il seguente approccio:
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);
}
... ma questo è abbastanza noioso e ho un sacco di risorse annidate e così via. Il problema che vedo è che non riesco ad utilizzare AutoMapper perché non mi consente di fornire alcune cose necessarie durante la proiezione che sono circoscritte al punto in cui viene eseguita l'operazione di mappatura. In questo caso, la proprietà Url di ApiController fornisce l'istanza UrlHelper di cui ho bisogno per creare i collegamenti per me, ma potrebbero esserci altri casi.
Come risolverebbe questo enigma?
P.S. Ho digitato questo codice in modo specifico per questa domanda, che è stato compilato nella tua testa ma potrebbe non riuscire nel tuo IDE preferito.
Al momento sono propenso a creare la mappa sul sito di chiamata ma non so se sia una buona idea. –
Quando vengono definiti i collegamenti? Durante il runtime? – carlpett
Per essere più precisi, i collegamenti sono definiti 1) al momento della compilazione, 2) al momento dell'avvio o 3) al tempo di mappatura/risoluzione? – carlpett