Prefazione
In un'applicazione che è separata per layer o distribuita dai servizi, è comune avere classi strettamente correlate ai dati, ma che desideriamo avere accoppiate liberamente. La mia solita soluzione (in c #) è di averli implementare un'interfaccia comune. (Ci sono altri pattern, ma questo è quello che imposto di default)
Potrei (per esempio) avere un'entità dati backend Foo
public class Foo:IFoo
{
public int DatabaseKey {get; set;}
public string NaturalKey {get; set;}
public string SomeProperty {get; set;}
}
una classe di contratto dati FooDto
[DataContract]
public class FooDto:IFoo
{
[DataMember]
public string NaturalKey {get; set;}
[DataMember]
public string SomeProperty {get; set;}
}
e una classe modello MVC FooModel
public class FooModel:IFoo
{
public string NaturalKey {get; set;}
public string SomeProperty {get; set;}
public string CssClass {get; set;}
}
tutti implementano un'interfaccia comune IFoo
public interface IFoo
{
string NaturalKey {get;}
string SomeProperty {get;}
}
La mia domanda
Quando mappiamo le incarnazioni di Foo l'una sull'altra potrei usare un object mapper (ad esempio l'automapper), ma per i progetti più piccoli o quando la politica impedisce a software di terze parti aggiungo un costruttore che prende l'interfaccia come parametro, cioè
public Foo(IFoo template):base()
{
NaturalKey = template.NaturalKey;
SomeProperty = template.SomeProperty;
//additional code
}
etc
Come posso evitare di ripetere inutilmente i compiti dal modello alle proprietà attraverso le diverse classi? Supponiamo che il modello generale sia dato come è la decisione di non usare un object mapper. Tieni presente che le assegnazioni potrebbero essere diverse in alcuni casi (deducendo i valori di default espliciti per valori nulli ecc.)