DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

EntityObject e DTO: copiare proprietà comuni via extension method

Quando si sviluppano architetture N-tier che prevedono uno o più service layer è sempre consigliabile l’utilizzo di DTO per scambiare dati tra livelli, indipendentemente dal (fuorviante) fatto che ogni DataContract esposto da un servizio (es. WCF) possa essere in mapping 1:1 con i business objects (es. EntityObject). Un DTO infatti è solitamente un POCO le cui proprietà in molti casi si possono mappare sia nel nome che nel tipo in un sottoinsieme di quelle di uno o più oggetti di business.
Ad ogni modo, al fine di aumentare la produttività nel valorizzare un DTO che possiede proprietà in comune nel nome e nel tipo con uno o più EntityObject, può avere senso implementare un extension method che via reflection copi il valore delle proprietà di un oggetto sorgente nelle proprietà di un oggetto destinazione appunto qualora tali proprietà abbiano stesso nome e tipo.

public static void CopyProperties<T1, T2>(this T1 source, T2 destination)
{           
   if (source == null) throw new ArgumentNullException("Source object can’t be null.");
  
if (destination == null) throw new ArgumentNullException("Destination object can’t be null.");

  
PropertyInfo[] destinationPropertyInfos = destination.GetType().GetProperties();
  
foreach (PropertyInfo propertyInfo in destinationPropertyInfos)
  
{
    
if (propertyInfo.CanWrite)
    
{
      
source.GetType().GetProperties()
          
.Where(p => p.CanRead && (p.Name == propertyInfo.Name && p.PropertyType == propertyInfo.PropertyType))
          
.ToList()
          
.ForEach(p => propertyInfo.SetValue(destination, p.GetValue(source, null), null));
    
}
  
}
}


Quindi, supponendo di avere il seguente object model di partenza...

 

...è possibile scrivere qualcosa del genere, al fine di evitare la noiosa scrittura delle solite righe di inizializzazione della classe DTO partendo dall’ Entity Objecy:

Customer customerEntity = null;
using (NorthwindEntities entities = new NorthwindEntities())
{
 
customerEntity = entities.Customers.First(c => c.CustomerID == "ALFKI");                
}

CustomerDTO customerDTO = new CustomerDTO();
customerEntity.CopyProperties(customerDTO);    


Technorati Tag: ,

Print | posted on sabato 21 febbraio 2009 03:33 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET