-2

これは少し一般的な質問です。A.dll にクラス X があり、B.dll が A.dll を参照し、C.dll が B.dll を参照しているとします。

ここで、C.dll (コンシューマー コード) で X を使用する必要があります。したがって、私がやりたいことは、B.dll でラッパー クラス X1 を作成し、それをコンシューマー コードで使用することです。では、ここで質問です。X1 を (ほぼ) X の完全なラッパーにする方法は?

ありがとう。

4

2 に答える 2

1

.NET では、X または X から継承するクラスを使用する場合、A.dll を直接参照する必要があります。コンシューマ C.dll が A.dll を直接参照しないようにする場合、2 つの方法があります。X を完全に隠したい場合は、真のラッパーを作成する必要があります (以下の例を参照)。別の方法として、レイト バインディングを使用することもできます (推奨されませんが、C は間接的なアセンブリ参照のみで X にアクセスできます)。

静的に型指定されたラッパーを使用する (推奨される方法)

(X を継承するだけでなく) ラッパーが必要な場合は、単純に手動でラッパーを作成することをお勧めします。つまり、X 型のプライベート変数を持つクラス X1 を作成します。X の対応するメンバーを呼び出すことによって、X のすべてのパブリック関数とプロパティを実装します。これは、X のラッパーのみが必要な場合に機能します。このようにして、X を B から隠すことができます (これがあなたの望みだと思います)。

A.dll

public class X {
   public int A { get; set; }
   public bool DoSomething() {
      A++;
   }
}

B.dll

public class X1 {
   private X X;
   X1() {
       X = new X();
   }
   public int A { get { return X.A; } set { X.A = value } }
   public bool DoSomething() {
      return X.DoSomething();
   }
}

遅延バインディングの使用 (手動ラッパーは不要)

技術的にはラッパーではありませんが、C.dll からの直接参照として A.dll を回避したい場合

3 番目の方法は、X をラップするのではなく、C.dll が X を未知のオブジェクトとして使用するようにすることです。このメソッドは、呼び出しサイトと C# の「動的」オブジェクトを利用します。これにより、B.dll は、コンパイル時に C.dll から明示的に参照しなくても、真の X を返すことができます (そうしない正当な理由がある場合)。Microsoft は、オーバーヘッドが非常に低くなるように、C.dll からの各プロパティ/関数呼び出しに対して、いわゆる「呼び出しサイト」を作成します。動的メソッドの良い点は、ラッパーが X への変更に追従することです。悪い点は、C.dll に実行時バインディングがある (コンパイル エラーがない) ことです。

public static class X1 {
   public static dynamic New() {
      return new X();
   }
}
于 2012-10-18T22:52:14.143 に答える
0

簡単な解決策はほとんどないと思います。タマネギのレイヤー/アーキテクチャを計画していると思います。

  1. 'B' のクラス X1 で 'C' のクラス X を継承し、'A' で X1 を使用します。

  2. 'C' のクラス X に対して 'B' のクラス X1 にファクトリ メソッドを作成し、'A' で使用します。

  3. 「B」のX1に「C」のクラスXのオブジェクトを作成し、必要なすべてのメソッドを記述し、それらのメソッドから元のクラスXへの呼び出しを転送します。

于 2012-10-19T04:59:14.087 に答える