我正在开发一个实现DDD和Repository Pattern的应用程序,如下图所示:
我希望我的Domain Layer一直无知,所以我不想在那里安装实体框架库。我面临的唯一问题是我的应用程序使用空间数据,但是我不应该使用DbGeography作为我的实体的属性类型,一旦它属于System.Data.Entity.Spatial命名空间, EntityFramework程序集。
有没有办法创建一个类来保存域层中的纬度,经度和高程值,如下所示:
public class Location
{
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Elevation { get; set; }
}
然后将该类转换为我的存储库层中的DbGeography?
换句话说,域实体只有Location类作为属性:
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; }
}
我将DbGegraphy转换为持久存储空间数据并仅在存储库层进行一些计算。我的计划是尝试这样的转换:
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);
}
}
但它不起作用,永远不会。我怎么能解决这个问题?在这种情况下,最佳做法是什么?
谢谢
答案 0 :(得分:0)
嗯,我不知道“正确”的方式,但是,我有一个棘手的想法。我希望,它会帮助你或提供更多变种:
Ypu有域实体Place
,它完全是持久无知的,它位于域汇编中。好。
让我们在Repository程序集中再创建一个Place类:
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 :)
}
}
}
我们为Entity Framework创建了特殊类,并将其映射到:
public class PlaceMap : ComplexTypeConfiguration<EFPlace>
{
public PlaceMap ()
{
Property(p => p.EFLocation).HasColumnName("Location");
Ignore(p => p.Location);
}
}
但是,我们必须在存储库中保存时从Place转换为EFPlace。您可以创建特殊构造函数或强制转换方法。 另一种变体 - 在域和存储库程序集中创建部分类Place。并在Repository one类中添加所需的属性,依此类推。 好吧,它看起来很丑陋:(但是,我不知道“纯粹”,现实生活中持久无知域的例子。我们总是有实体框架的限制。NHibernate有更多的功能。