我们正在研究一个新项目(重写现有应用程序),并且我遇到了域模型 /存储库设计的问题。

这是我们域模型中两个关键部分的(简化)版本:

alt text

如您所见,我有一个抽象的概念 邮政, ,这可以是评论,讨论,照片,视频等。帖子也可以发表评论。

我也有一个抽象的概念 地点, 显然是街道,城市,社区等。

现在,这自然而然地看着两个清晰的根源。

所以我创建了两个存储库,一个叫做 后排放, ,另一个叫 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应该使用软关系,例如它们之间

一个说骨根的根源很可能很好地获取其他相关的骨料根,而存储库只是找到骨料根的一种方法。

假设您使用了规范模式,您可以使用位置对象构建邮政规范吗?然后,您只需将规范传递给您的帖子存储库,然后取回结果即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top