【问题标题】:Domain Model with Nhibernate design issue具有 Nhibernate 设计问题的域模型
【发布时间】:2012-06-04 23:35:00
【问题描述】:
我正在尝试开始“使用 C# 进行 DDD”世界。
我使用 NHibernate 作为我的 ORM 工具,因此试图开发一个 PI(Persistence Ignorance) 模型。
但是,在我的一些实体(表示为 POCOS)中,我的属性设置器中有业务规则。
例如,我有一个“用户”实体,它有一个标志,指示该用户是否被阻止,当这个标志为真时,第二个字段称为“阻止日期”
必须自动填写当前日期。
一切看起来都非常清晰和简单,但是问题出现在我正在恢复已经保存在数据库中的用户的那一刻,即使
根据这个逻辑,被阻止的用户会将他们的“阻止日期”更新为当前日期。
最初我认为在第二个标志“isLoaded”中表示该对象正在被 NHibernate 水合,然后这个逻辑不会启动,
但这似乎不像 PI。有什么改进的建议吗?
【问题讨论】:
标签:
c#
nhibernate
domain-driven-design
【解决方案1】:
除了针对 NHibernate 问题的 Miroslavs 解决方案之外,我真的建议不要将逻辑放在属性设置器后面,尤其是在需要更改其他字段时。
public void Block()
{
_isBlocked = true;
_blockedDate = DateTime.Now;
}
查看this question 的答案以了解原因。
【解决方案2】:
您可以在映射中为 IsBlocked 属性定义字段访问策略。基本上,您会告诉 NHibernate 使用底层私有字段 (_isBlocked) 而不是属性,因此不会执行 IsBlocked 属性中的设置器逻辑。
This SO question 对访问策略有很好的回答。
NHibernate 官方documentation.
如果您使用 Fluent NHibernate 进行映射,您可以这样定义它:
Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore);