Sto sviluppando un'applicazione che implementa il pattern DDD e Repository come mostrato nel diagramma seguente:
Mi aspetto di mantenere l'ignorante persistente del mio layer di dominio, quindi non mi piacerebbe installare lì le librerie del framework di entità. L'unico problema che sto affrontando è che la mia applicazione utilizza dati spaziali, ma non dovrei usare DbGeography come un tipo di proprietà delle mie entità, una volta che appartiene allo spazio dei nomi System.Data.Entity.Spatial, dall'assembly EntityFramework.
C'è un modo per creare una classe per mantenere i valori di latitudine, longitudine e elevazione in Domain Layer, in questo modo:
public class Location
{
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Elevation { get; set; }
}
e quindi convertire quella classe in DbGeography nel mio livello di repository?
In altre parole, le entità di dominio avrebbero solo la classe Location come proprietà:
public class Place : IEntityBase, ILocalizable
{
public int Id { get; set; }
public string Name { get; set; }
public Location Location { get; set; }
public User Owner { get; set; }
}
e lo convertivo in DbGegraphy per mantenere i dati spaziali e fare alcuni calcoli solo nel livello repository. I miei piani erano di provare qualcosa del genere per convertire:
public class LocationMap : ComplexTypeConfiguration<Location>
{
public LocationMap()
{
Property(l => DbGeography.FromText(string.Format("POINT({0} {1})", l.Longitude, l.Latitude))).HasColumnName("Location");
Ignore(l => l.Elevation);
Ignore(l => l.Latitude);
Ignore(l => l.Longitude);
}
}
Ma non funziona e non lo farà mai. Come posso risolvere questo problema? Quali sono le migliori pratiche in questa situazione?
Grazie
Beh, non conosco il modo "giusto", ma ho un'idea difficile. Spero, ti aiuterà o fornirai altre varianti: Ypu ha un'entità di dominio Place
, è completamente ignorante persistente ed è posto nell'assembly Dominio. Buona. Consente di creare un'altra classe Place nell'assembly del repository:
internal sealed class EFPlace : Place
{
DbGeography EFLocation
{
get
{
return DbGeography.FromText(string.Format("POINT({0} {1})", Location.Longitude, Location.Latitude);
}
set
{
//vice versa convertion, I don't know, how to do it :)
}
}
}
Abbiamo creato una classe speciale per Entity Framework e la mappiamo:
public class PlaceMap : ComplexTypeConfiguration<EFPlace>
{
public PlaceMap ()
{
Property(p => p.EFLocation).HasColumnName("Location");
Ignore(p => p.Location);
}
}
Ma, dobbiamo convertire da Place a EFPlace su Salva nel repository. È possibile creare un costruttore speciale o un metodo di fusione. Un'altra variante: crea un posizionamento di classe parziale negli assembly Dominio e Repository. E aggiungi la proprietà appropriata in un repository di una classe e così via. Beh, sembra brutto: (ma, non conosco esempi "puri", di vita reale, di Dominant Ignorant Persistente. Abbiamo sempre dei limiti di Entity Framework. NHibernate ha un po 'più di funzioni.