6

Zajmuję się tworzeniem aplikacji, która implementuje DDD i repozytorium Wzorzec, jak pokazano na schemacie poniżej:Persistent Ignorant Domeny z Entity Framework i Przestrzennej Danych

My Software Architecture

Spodziewam się zachować moja domena warstwę trwałe ignorantem, więc Nie chciałbym tam instalować bibliotek frameworków encji. Jedyny problem jaki napotykam to to, że moja aplikacja używa danych przestrzennych, ale nie powinienem używać DbGeography jako typu własności moich jednostek, gdy tylko należy do przestrzeni nazw System.Data.Entity.Spatial, z zespołu EntityFramework.

Czy istnieje sposób, aby utworzyć klasę utrzymywania szerokości, długości i rzędnych wartości w warstwie domeny, tak:

public class Location 
{ 
    public double Latitude { get; set; } 
    public double Longitude { get; set; } 
    public double Elevation { get; set; } 
} 

a następnie przekonwertować do DbGeography klasę w moim repozytorium warstwy?

Innymi słowy, podmioty domeny będzie mieć tylko klasę lokalizacji jako właściwość:

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; } 
} 

a ja przekształcić go DbGegraphy utrzymują danych przestrzennych i zrobić kilka obliczeń tylko w warstwie repozytorium. Moim planem było wypróbowanie czegoś takiego, aby przekonwertować:

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); 
    } 
} 

Ale to nie działa i nigdy nie będzie. Jak mogę rozwiązać ten problem? Jakie są najlepsze praktyki w tej sytuacji?

Dziękuję

+0

Witam @GertArnold, Proszę spojrzeć. https://msdn.microsoft.com/pt-br/library/system.data.spatial.dbgeography(vsv.110).aspx. –

+0

Ładnie wykonana architektura aplikacji BTW –

+0

'System .Data.Spatial' jest obszarem nazw .Net –

Odpowiedz

0

Cóż, nie wiem, „prawo” sposób, ale mam trudne pojęcia. Mam nadzieję, że to ci pomoże lub podasz kilka wariantów: Ypu ma jednostkę domeny Place, jest w pełni wytrwałym ignorantem i jest miejscem w zespole Domain. Dobry. Pozwala utworzyć jeszcze jedną klasę miejsce w repozytorium montażu:

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 :) 
     } 
    } 
} 

Stworzyliśmy specjalną klasę dla Entity Framework, i map go:

public class PlaceMap : ComplexTypeConfiguration<EFPlace> 
{ 
    public PlaceMap() 
    { 
     Property(p => p.EFLocation).HasColumnName("Location"); 
     Ignore(p => p.Location); 
    } 
} 

Ale musimy przekształcić się z miejsca na EFPlace na Zapisz się magazyn. Możesz utworzyć specjalny konstruktor lub metodę rzutowania. Inny wariant - tworzenie częściowej klasy Miejsce w zestawach domen i repozytorium. I dodaj potrzebne dane w repozytorium jednej klasy i tak dalej. Cóż, wygląda to brzydko :(ale nie znam "czystych", rzeczywistych przykładów Persistent Ignorant Domain, zawsze mamy ograniczenia Entity Framework, NHibernate ma trochę więcej funkcji: