質問のコンテキスト
そこで、アプリケーションを境界付けられたコンテキスト (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 のセットを返します。JpaGamer
someSensitiveData
someGamer.getFriends()
SparsePersistingGamer
JpaGamer
someSensitiveData
JpaGamer
類似または関連する状況に対処するために、どの戦略を適用しますか?