概要
私は2つの主要な抽象化レベルを使用するアプリケーションに取り組んでいます:
- コアライブラリはいくつかのインターフェイスを定義し、インターフェイスの観点からコア機能を実装するクラスを含みます。このように、コアアルゴリズムを一度作成したいと思いますが、それらを任意の数のインターフェイス実装に適用できるようにします。
- 「実装」ライブラリは、サードパーティのSDKを使用して、一連のインターフェイスの1つの特定の実装を提供します。最終的には、これらのライブラリが複数存在することになります。どちらを使用するかは、構成によって決まります。
アプリケーション自体がSDKライブラリからクラスをインスタンス化し、それらを使用してコアライブラリの依存関係を満たします。
問題
私が解決する必要のある問題は、一般的に次のようになります。
// Algorithm in the core (interfaces are all implemented by the SDK library):
ICorrespondentRepository allCorrespondents = ...;
ICorrespondent correspondent = allCorrespondents.FindByName(...);
...
IDocumentRepository allDocuments = ...;
IDocument document = allDocuments.FindByTitle(...);
// Problem: Implementation needs state not exposed
// on ICorrespondent in order to do this:
document.SetRecipient(correspondent);
つまりIDocument
、受信者を以前に取得したに設定することができますICorrespondent
。がSetRecipient
呼び出されると、実際に変更を行うために、IDocument
-に関連付けられているが-によって公開されていないニーズ状態(コアにとって重要ではない主キー)の実装が必要になります。ICorrespondent
ICorrespondent
これを行う1つの方法は、内部の実際の実装クラスにダウンキャストすることですSetRecipient
が、これは非常に扱いにくいと感じます。さらに悪いことに、インターフェイス参照から内部状態へのマップを保持します。
問題の根本は、インターフェースが、コアとそれを生成した実装ライブラリという、要件の異なる2つのコンシューマーを効果的に持っているにもかかわらず、コアライブラリの一般的なニーズに対応するように排他的に設計されていることです。
この種の要件を再設計するためのより良い方法はありますか?