Persistent Ignorant Domain with Entity Framework and Spacial Data

c# domain-driven-design entity-framework entity-framework-6

Question

I'm developing an application that implements DDD and Repository Pattern as shown in diagram bellow:

My Software Architecture

I expect to keep my Domain Layer persistent ignorant, so I wouldn't like to install entity framework libraries there. The only problem I'm facing is that my application uses spatial data, but I'm not supposed to use DbGeography as a Property Type of my entities, once it belongs to System.Data.Entity.Spatial namespace, from EntityFramework assembly.

Is there a way to create a class to hold latitude, longitude and elevation values in Domain Layer, like that:

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

and then convert that class to DbGeography in my Repository Layer?

In other words, the domain entities would have only Location class as a property:

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

and I'd convert it DbGegraphy to persist spatial data and do some calculations only in repository layer. My plans was try something like that to convert:

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

But it doesn't work and never will. How I can solve this problem? What are the best practices in this situation?

Thank you

1
9
8/5/2015 8:44:55 PM

Popular Answer

Well, I don't know "right" way, but, i have a tricky idea. I hope, it'll help you or give some more variants: Ypu have domain entity Place, it's fully persistent ignorant and it's place in Domain assembly. Good. Lets create one more Place class in Repository assembly:

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

We created special class for Entity Framework, and map it:

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

But, we have to convert from Place to EFPlace on save in repository. You can create special constructor, or casting method. Another variant - create partial class Place in Domain and Repository assemblies. And add needed propery in Repository one class and so on. Well, it looks ugly :( but, I don't know "pure", real-life examples of Persistent Ignorant Domain. We always have limitations of Entity Framework. NHibernate has a little more features.

0
8/10/2015 2:29:19 PM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow