【问题标题】: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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        相关资源
        最近更新 更多