Supponiamo di avere un oggetto utilizzato dal mio codice, ad esempio Persona:
public class Person {
public string Name {get;set;}
public Address Address {get; set;}
}
public class Address {
public string AddressLine1 {get;set;}
public string AddressLine2 {get;set;}
public string City {get;set;}
public string State {get;set;}
public string ZipCode {get;set;}
}
Semplice finora. Supponiamo che io mantenga questo oggetto in SQL Server nel modo seguente:
public class PersonEntity {
public string Name {get;set;}
public string AddressLine1 {get;set;}
public string AddressLine2 {get;set;}
public string City {get;set;}
public string State {get;set;}
public string ZipCode {get;set;}
}
Ovviamente, è bene astrarre il modo in cui un oggetto viene mantenuto nel DB dalla logica. In questo modo, posso sostituire l'aspetto dei miei tavoli o la mia tecnologia senza modificare la logica della mia soluzione.
Il problema sorge se voglio usare il repository astratto:
public interface IRepository<TEntity>{
IEnumerable<TEntity> Get(Func<TEntity, bool> pre);
...
}
public class PersonRepository<PersonEntity>{
...
}
Ora, se il mio codice di logica aziendale vuole accedere al repository, devono sapere su PersonEntity per poter utilizzare la funzione Get generica. Idealmente, la logica aziendale deve inviare una richiesta come Get(person => person.Address.State == "NY");
invece.
C'è via, elegante e semplice, per raggiungere quel livello di astrazione?