質問のコンテキスト
そこで、アプリケーションを境界付けられたコンテキスト (Eric Evans の「ドメイン駆動設計」) に編成しました。境界付けられたコンテキストの 1 つが「ゲームプレイ コンテキスト」です。たとえば、インターフェイスが含まれていますGamer
public interface Gamer {
void setFriends(Set<Gamer> friends);
Set<Gamer> getFriends();
....
}
Gamerの状態をデータベースに永続化できる実装もあります。
@Entity
public class JpaGamer implements Gamer {
private String someData;
private String someSensitiveData;
public setFriends (Set<Gamer> friends) {
...
}
...
}
はるか遠く、「アカウント コンテキスト」と呼ばれる別の境界付けられたコンテキスト内に、アプリケーションのユーザーを処理するクラスとインターフェイスがあります。たとえば、 というインターフェースがありますAccount。
public interface Account{
boolean isSignedUp();
....
}
したがって、ユーザー /Accountはサインアップするかどうかを指定できます。任意Accountの に対して、対応する が存在しGamerます。
チャレンジ
私にはビジネスルールがあります。 Account
たとえば、これは、サインアップしていない一部Accountの JpaGamerインスタンスがフィールドにデータを書き込めないことを意味しsomeSensitiveDataます。JpaGamerこれは「未登録JpaGamer」であると非公式に言うことができます。
アカウント関連のロジックをゲームプレイ関連にハードコードしたくはありません (逆も同様です)。
境界付けられたコンテキストを他の境界付けられたコンテキストの概念で汚染することなく、Java でそのようなビジネス ルールを実装するにはどうすればよいでしょうか?
ビジネスルールを満たすために、「未登録」があるときはいつでもJpaGamer、それを でラップするという考えJpaGamerがありSparsePersistingGamerます。は、を改ざんする可能性のあるメソッドをSparsePersistingJpaGamer基になるメソッドに転送しません。
しかし今、私はその方法に問題があります。の場合、 JPA からすべてのゲーマーのフレンドを遅延ロードし、(およびその他の) ビジネス ルールを認識しないプレーンな s のセットを返します。JpaGamersomeSensitiveDatasomeGamer.getFriends()SparsePersistingGamerJpaGamersomeSensitiveDataJpaGamer
類似または関連する状況に対処するために、どの戦略を適用しますか?