2

クラスライブラリ(dll)にあるパブリッククラスMainObjectがあります。この例では、これをBaseLibraryと呼びます。

BaseLibraryを参照してそのメンバーにアクセスする上位レベルのクラスライブラリがあります。これをDeviceLibraryと呼びます。

次に、DeviceLibraryへの参照を追加したWindowsフォームプロジェクトDeviceControlがあります。

MainObjectオブジェクトを使用する必要がある場合、どうすればよいですか?DeviceControlプロジェクトの2番目の参照をBaseLibraryに追加できることは知っていますが、DeviceLibraryを介してそれにアクセスする別の方法があるかどうか疑問に思っていますか?カプセル化の法則がここで何を指示しているかわかりません...

4

4 に答える 4

3

参照を追加する必要があります。そうしないと、コンパイラは文句を言って、参照を追加するように指示します。Reflection のハックを使用することは、非常に遠い 2 番目の選択肢である必要があります。コードが遅くなるだけで、DLL への実行時の依存関係は削除されません。

于 2010-07-16T14:15:15.747 に答える
1

ライブラリ アセンブリの内容を変更できる場合 (つまり、自分のコードである場合)、次のいずれかを実行できます。

  1. MainObject別の参照アセンブリに移動し、既存のアセンブリのいずれかがそれを参照するようにします。MainObjectBaseLibrary の他のコンテンツに実際に依存していない場合、これはうまく機能します。

  2. インターフェイスを抽出し、他のすべてのアセンブリが参照できる参照ライブラリにMainObject配置します。次に、インターフェイスにコードを記述します。新しい参照ライブラリへの参照のみが必要です。

ライブラリ アセンブリの内容を変更できない場合は、独自のインターフェイスを使用して MainObject のラッパー オブジェクトを作成し、オプション 2 のように参照ライブラリへのインターフェイスを抽出することに頼ることができます。

于 2010-07-16T12:41:25.607 に答える
1

コードで参照する型は、直接参照されるアセンブリの一部である必要があります。

通常は実用的ではありませんが、代わりに参照を使用し、リフレクションを使用してそのメンバーを呼び出すMainObjectことにより、直接参照せずに を使用できます。C# 4.0 では、おそらく次のキーワードSystem.Objectを使用できます。dynamic

dynamic x = MethodReturningAMainObject();
x.Foo(); //this will be compiled to use reflection to find "Foo"

動的またはobject参照を使用する以外に、に適用される任意の公開された基本クラスまたはインターフェイスを使用できますMainObject

于 2010-07-16T11:58:43.667 に答える
0

免責事項:これはあなたの質問に完全には対応していません。

通常、N 層設計では、「モデル」はすべての層にまたがります。設計時に参照する 1 つのグラフを次に示します: http://i.msdn.microsoft.com/cc700340.fig01_L(en-us).gif

BaseLibrary に何が含まれているかはわかりませんが、DeviceLibrary から参照する必要があるようです。

于 2010-07-16T12:20:13.757 に答える