最初に、私がから来ている場所を理解するのを助けるための小さな紹介:私はこの質問にどのようにタイトルを付けるかわからなかったか、リポジトリトラッキング作業単位の変更。 (私はいくつかの部分を残しておきますWIP)インターフェイスとオブザーバーパターンへのプログラム
interface ChangeListener
{
public function onSubjectChanged(ChangeSubject $subject, array $data);
}
interface ChangeSubject
{
public function addChangeListener(ChangeListener $listener);
}
と私はまた、リポジトリと作業単位を有する:
Iは、結合された2つのインターフェース、ChangeListener
とChangeSubject
を有する
interface UnitOfWork extends ChangeSubject
{
public function commit();
public function hydrateChange(array $data, ArrayService $arrayService);
}
interface Repository extends ChangeListener
{
public function commit() : \bool;
public function commitCount() : \int;
}
さて、UnitOfWork
の私の実装では、のは、メソッドhydrateChange
で、より正確に、Book
それを呼ぶことにしましょう、私は簡単に変更、のリポジトリに通知:
$repository->onSubjectChanged($this, $newHydration);
問題は、リポジトリ内で本のIDを知る必要があることです。しかし、リポジトリの処理方法には、Book
が持つIDを持たないChangeSubject
を受け取ります。
このようなシステムを正しく設計するにはどうすればよいですか?
PHPにジェネリックがあったとしたら、これは可能でしょう。私が好きではないハックな解決策は、instanceof
を使用しています。
このシナリオでは、どこかで 'instanceof'を使用することになります。 UnitOfWorkとビジネスオブジェクトを結合したのはなぜですか?ビジネスオブジェクトは、永続性に関連する問題を認識すべきではありません。 –
@SebastianKeßlerBusiness Objectsと永続性の間の依存関係はどこにありますか?それは依存性の逆転であり、永続性は外部からChangeListenerとして注入されますが、誰が何をしたかを追跡するセキュリティサービスのように(セキュリティ用語ではアカウンティング)、他のものも存在する可能性があります。 PHPがジェネリックをサポートする場合、 'instanceof'は必要ありません。 – Flavius
これはDDDと何が関係しているのか分かりません... –