クラス ライブラリにプラグイン アーキテクチャを公開した状況があり、作成したインターフェイスを他のユーザーに実装して、そのカスタム実装をクラスで使用できるようにしたいと考えています。
これを実現するために、依存性注入 (具体的にはコンストラクター注入) を使用しています。
これは問題なく動作しますが、次の 2 つの相反する目標でアプリケーションを設計しようとしたという事実を除きます。
- API の利用者は、戻り値を変更できません。カスタムの読み取り専用コレクションとオブジェクトを作成
internal
し、セッターなどを使用して、消費者が変更できないようにしました - 他のアセンブリのプラグインは、これらの内部メソッドとプロパティにアクセスできる必要があります
これらの 2 つの目標は矛盾しています。なぜなら、私の API (または C# ) がプラグイン アセンブリへの (または同様の方法で)internal
アクセスを許可する方法がないためです。InternalsVisibleTo
実例
3 つのアセンブリがあるとします。私のクラス ( Class
)、プラグイン アセンブリ ( Plugin
)、およびコンシューマー アセンブリ ( Consumer
)。
インターフェイスは、API (アセンブリIReturnValue
内のメソッドまたはクラス) の戻り値を指定します。Class
問題は次のとおりです:の特定のインスタンスにPlugin
読み取り専用 ( ) プロパティとインデクサーを設定できるようにしたいのですが、コードでこれを実行できるようにしたくありません。internal
IReturnValue
Consumer
プラグイン システムが機能しているため、どのアセンブリに付与InternalsVisibleTo
するかを事前に知ることはできません。
この状況では、消費者が戻り値の型を変更することを本当に気にする必要がありますか? もしそうなら、それは彼ら自身のせいのようです。そして、この問題を解決する適切な解決策は思いつきません。