6

「DDDwithC#」の世界で始めようとしています。私はORMツールとしてNHibernateを使用しているため、PI(Persistence Ignorance)モデルを開発しようとしています。ただし、一部のエンティティ(POCOSとして表されている)では、プロパティのセッターにビジネスルールがあります。たとえば、このユーザーがブロックされているかどうかを示すフラグを持つ「User」エンティティがあります。このフラグがtrueの場合、「BlockDate」という2番目のフィールドに現在の日付を自動的に入力する必要があります。すべてが非常に明確で単純に見えますが、このロジックに従って、ブロックされたユーザーの「ブロックされた日付」が現在の日付に更新されても、データベースにすでに存在しているユーザーを回復している瞬間に問題が発生します。最初は、オブジェクトがNHibernateによってハイドレイトされていることを示す、2番目のフラグ「isLoaded」で考えました。その後、このロジックは起動されませんが、これはPIのようには見えませんでした。これを改善する方法について何か提案はありますか?

4

2 に答える 2

4

IsBlockedプロパティのマッピングでフィールドアクセス戦略を定義できます。基本的に、プロパティの代わりに基になるプライベートフィールド(_isBlocked)を使用するようにNHibernateに指示するため、IsBlockedプロパティのセッターロジックは実行されません。

このSOの質問には、アクセス戦略に関する良い答えがあります。

NHibernateの公式ドキュメント

マッピングにFluentNHibernateを使用している場合、次のように定義できます。

Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore);
于 2012-05-31T01:19:55.637 に答える
4

NHibernate問題のMiroslavsソリューションに加えて、特に他のフィールドを変更する必要がある場合は、プロパティセッターの背後にロジックを配置することから離れることを強くお勧めします。

public void Block()
{
   _isBlocked = true;
   _blockedDate = DateTime.Now;
}

理由については、この質問への回答を参照してください。

于 2012-05-31T09:02:35.017 に答える