【发布时间】:2012-01-06 08:58:26
【问题描述】:
public class Person
{
public IList<String> SpecialBirthPlaces;
public static readonly DateTime ImportantDate;
public String BirthPlace {get;set;}
public DateTime BirthDate
{
set
{
if (BirthPlace!=null &&
value < ImportantDate &&
SpecialBirthPlaces.Contains(BirthPlace))
{
BirthPlace = DataBase.GetBirthPlaceFor(BirthPlace, value);
}
}
}
}
这是在我的域模型中封装一个简单规则的尝试。我试图捕捉的规则是:当我们出于某种原因更新一个人的出生日期(例如,原始用户输入中有错误)时,我们需要检查这个人的出生地并将其替换为来自 a数据库,如果它在我们的数据库中被列为特殊出生地。
但是,我在实现它时遇到了 2 个问题:
此规则修改域实体状态(属性),我需要在用户界面中反映此更改。我的域模型是 POCO。我可以将此逻辑放在 ViewModel 中,但这是错误的,因为它不是 UI 逻辑。这是我需要捕获的重要域规则。
我的 SpecialBirthPlaces 列表非常大,我不想每次从数据库中获取客户时都填充它。另外,当满足规则时,我需要更换出生地。正如我所说,特殊出生地和替代品的列表非常大,并且存储在数据库中。
如何实现我需要的 DDD 风格的逻辑?
【问题讨论】:
-
我不太明白这个问题。您是在问如何缓存大量项目(SpecialBirthPlaces)或如何将更改持久化到域模型?从 DDD 的角度来看,Bounded Context 似乎是围绕一个人的出生日期和地点的规则的集合,而 Person 聚合根需要有一个允许更改日期和地点的方法。对出生日期和地点的更改将触发导致更新数据存储的事件。我可能完全离开了,因为我自己是 DDD 的新手。
-
如果出生地在 1991 年之前和之后的“圣彼得堡”,您是否试图实现将“列宁格勒”显示为出生地?
-
有点晚了,但我处于同样的情况,我是堆栈。您是否设法找到有效的解决方案?或者至少是一些关于 ddd 的正式方法?