我正在尝试开始“使用 C# 进行 DDD”世界。我使用 NHibernate 作为我的 ORM 工具,因此试图开发一个 PI(Persistence Ignorance) 模型。但是,在我的一些实体(表示为 POCOS)中,我的属性设置器中有业务规则。例如,我有一个“用户”实体,它有一个标志,表明该用户是否被阻止,当这个标志为真时,必须自动填写第二个名为“阻止日期”的字段当前日期。一切看起来都非常清晰和简单,但是问题出现在我正在恢复已经保存在数据库中的用户的那一刻,即使被阻止的用户会将他们的“阻止日期”更新到当前日期,根据这个逻辑. 最初我认为在第二个标志“isLoaded”中表示对象正在被 NHibernate 水合,然后这个逻辑不会启动,但这看起来不像 PI。关于如何改进这一点的任何建议?
问问题
643 次
2 回答
4
除了针对 NHibernate 问题的 Miroslavs 解决方案之外,我真的建议不要将逻辑放在属性设置器后面,尤其是在需要更改其他字段时。
public void Block()
{
_isBlocked = true;
_blockedDate = DateTime.Now;
}
请参阅此问题的答案以了解原因。
于 2012-05-31T09:02:35.017 回答
4
您可以在 IsBlocked 属性的映射中定义字段访问策略。基本上,您会告诉 NHibernate 使用底层私有字段 (_isBlocked) 而不是属性,因此,您在 IsBlocked 属性中的设置器逻辑不会被执行。
这个 SO question对访问策略有一个很好的答案。
NHibernate 官方文档。
如果您使用 Fluent NHibernate 进行映射,您可以这样定义它:
Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore);
于 2012-05-31T01:19:55.637 回答