DDD(域驱动设计),如何处理实体状态更改,以及封装需要处理大量数据的业务规则

Ale*_*sev 22 c# domain-driven-design

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是尝试在我的域模型中封装一个简单的规则.我试图捕获的规则是:当出于某种原因,我们更新一个人的出生日期(例如,原始用户输入中存在错误)时,我们需要检查该人的出生地并将其替换为来自其他人的其他值.数据库,如果它在我们的数据库中列为特殊的出生地.

但是,我实现它有两个问题:

  1. 此规则修改域实体状态(属性),我需要在用户界面中反映此更改.我的域名模型是POCO.我可以把这个逻辑放在ViewModel中,但这是错误的,因为它不是UI逻辑.这是我需要捕获的一个重要的域规则.

  2. 我的SpecialBirthPlaces列表非常大,每次我从数据库中获取客户时我都不想填充它.此外,当规则得到满足时,我需要替换Birthplace.正如我所说,特殊的出生地和替代品的列表非常大,并存储在数据库中.

如何在DDD风格中实现我需要的逻辑?

Pau*_*aul -1

IMO 性能方面的最佳方法是在数据库中创建一个存储过程,并在属性更改事件上标记实体,以便在向数据库提交更改(SaveChanges() 调用)时调用它。ObjectContext.ExecuteFunction在这种情况下是你的朋友。

将所有出生地查找和更新的逻辑放在该存储过程中。确保存储过程包含在事务中 - 以便在更新失败时回滚更改。

编辑:抱歉,没有与 DDD 相关的答案。

  • 抱歉,Paul,但你的回答对于我的情况来说实际上 100% 不正确,这很有趣 -) 首先,这与 DDD 无关。2.我使用的对象数据库没有存储过程,我的实体是POCO对象并且没有实现INotifyPropertyChanged,我不使用ObjectContexts(EF),在属性更改事件上调用存储过程是我最可怕的事情听说过。但是保罗,你真的让我很高兴,在我读到你的回答之前我很沮丧,谢谢你。 (4认同)