DDD-如何避免在这里跨越汇总边界?
-
28-09-2019 - |
题
我们正在研究一个新项目(重写现有应用程序),并且我遇到了域模型 /存储库设计的问题。
这是我们域模型中两个关键部分的(简化)版本:
如您所见,我有一个抽象的概念 邮政, ,这可以是评论,讨论,照片,视频等。帖子也可以发表评论。
我也有一个抽象的概念 地点, 显然是街道,城市,社区等。
现在,这自然而然地看着两个清晰的根源。
所以我创建了两个存储库,一个叫做 后排放, ,另一个叫 LICESEREPOSITOR.
这一切都很好,我可以添加/获取任何类型的帖子(或注释),并通过这两个存储库之一添加/获取任何类型的位置。
但是现在我正在为城市的“着陆页”的情况(例如)。
在此页面上,我基本上需要显示“此位置的所有帖子”。
如何定义?好吧,可以(选择)在一个位置标记一个帖子。实施细节,因此我不想深入数据(因为这不是DDD的目的),但是从本质上讲,地理空间智能可以解决哪些帖子在特定位置中包含在特定位置,以及标记的帖子的纬度/经度。
但是,如何在不跨越边界的情况下检索这些信息呢?
我使用哪个存储库?我需要一个新的吗?
如果它很重要(或者很好奇),这是一个Web应用程序(ASP.NET MVC),带有SQL Server 2008数据库和实体框架4.0。
如果您需要任何澄清,请告诉我。
编辑
目前,我们使用规范模式的修改版本来检索域模型。
例如,这是我们BLL中的代码,用于检索所有评论的分数> = 4:
var reviews = postRepository // GenericRepository<Post>
.Find() // IQueryable<Post>
.OfType<Review>() // IQueryable<Review>
.Where(x => x.Score >= 4)
.ToList(); // List<Review>
但是现在我需要这样的代码:
var reviews = postRepository
.Find()
.OfType<Review>()
.Where( //lat long, or Locations FK )
.ToList();
问题是,我不知道如何在不添加中间的联接范围内(位置置端 - 对许多人来说都是很多),并在后域模型中添加FK。
但是这样做,我正在跨越总边界 - 不是吗?
解决方案
我将在创建时间将帖子绑定到位置,以便在每个位置(通过存储库)获得关联帖子的列表。看起来像这样:
创建:
var p = new Post(latitude, longitude);
var locations = locationRepository.FindByCoordinates(latitude, longitude);
foreach (var l in locations)
{
l.AssociatePost(p);
}
session.Save(p);
恢复:
var associatedPosts = postRepository.FindByLocation(locationId);
foreach (var p in associatedPosts)
{
Display(p);
}
在引擎盖下,职位和位置之间的关联将作为多对多的桌子关系实现。该解决方案有一个问题:添加新位置需要扫描所有帖子并将其分配到新位置(如果适用)。
希望有帮助。
其他提示
为什么这是个问题?据埃文斯(Evans)在他的书中说,一个AR可能会引用另一个AR。 (但是,您可能不会从另一个AR中引用AR中的子元素)
另外,位置真的是根源吗?总体根源的定义是它充当了同意的边界。这适合位置的定义吗?我会说一个位置是一个值对象。
关于存储库和AR协会,这里几乎有两个营地:
一个说所有根源的人 不得不 通过各自的存储库获取,AR应该使用软关系,例如它们之间
一个说骨根的根源很可能很好地获取其他相关的骨料根,而存储库只是找到骨料根的一种方法。
假设您使用了规范模式,您可以使用位置对象构建邮政规范吗?然后,您只需将规范传递给您的帖子存储库,然后取回结果即可。