“ using”の代替C#のディレクティブキーワード?

StackOverflow https://stackoverflow.com/questions/1404779

  •  05-07-2019
  •  | 
  •  

質問

NDCでボブ・マーティンのエピソードを見終わったところ、彼は「使う」と言いました。ページの上部にあるC#のディレクティブは、コンポーネント間で作成/暗示される密結合のために不適切です。

プロジェクト参照とusingステートメントを追加せずに外部.dllを使用する方法はありますか?

V6を使用して、ProgIdの文字列でオブジェクトを作成できるようになったことを覚えています-これが私が探している手法かどうかはわかりませんが、プロジェクト参照を必要としない言語の例ですdllを使用します。

編集:会議へのリンク 。申し訳ありませんが、正確な引用やプレゼンテーションがありません。思い出で行きます。

役に立ちましたか?

解決

それは、使用するステートメント自体ではなく、それが多すぎる場合です。

using System; などのステートメント自体が問題になることはめったにありませんが、同じコードファイル内にたくさんある場合(どれに応じて3〜6個以上と言います) 、密結合の兆候である可能性があります。

同様に、プロジェクト自体の参照数にも同様の経験則を適用できます。

密結合の解決策は、インターフェイスへのプログラミングと依存性注入(DI)です。

VBから思い出せることを行うProgIdの方法は、単にCOMを実行することでした。本質的に、そのProgIdを使用して、目的のインターフェイスを実装したインスタンスへの参照を取得しました。欠点は、COMオブジェクトがユニバーサルに登録された場合にのみ機能することでした。 dllの地獄を覚えていますか?

特定のフレーバーのDIを使用しても同じ原則を適用できますが、インターフェイスは.NETタイプでIDLで定義されておらず、具体的な実装を提供するには何らかのDIコンテナーが必要です。

他のヒント

ボブ・マーティンは、実際にはアーリーバインディングとレイトバインディングを指していると思います。

.NETでは、リフレクション、より具体的にはファイル名またはアセンブリ名を使用して外部アセンブリに型を作成できるActivatorクラスを通じて、レイトバインディングが可能です。

通常、usingディレクティブ(usingステートメントではなく)は、外部アセンブリを直接参照する際に使用します。すなわち。アセンブリへの参照を追加してから、ディレクティブを使用して追加し、外部型を使用するときに完全な名前空間階層を入力する必要がないようにします。

コードの上部に多数のusingディレクティブがある場合、他の多くのタイプを直接参照しているため、これらのタイプでのコードの結合/依存性が増加している可能性があります。

これが、ボブが彼らを悪いと言っている理由だと思います。 「これは実際に悪いのですか?」という質問に対する答えこれは非常に主観的でコンテキストに依存するものです。

ただし、一般に、コンポーネントの分離は、ほとんどの場合、ソフトウェアの設計で目指すべき良い目標です。これは、システムの残りの部分への影響を最小限に抑えて、システムの一部を変更できるためです。ボブ・マーチンズの本を1つか2つ読んだら、これが彼の狙いだと思います。

using は名前空間へのショートカットであり、外部ファイルへの参照ではありません。したがって、これは本当に意味がありません。

とにかく、できることは、インターフェイスDLL(インターフェイスのみを備えたDLL)を持つことです。そのため、さまざまなアセンブリを動的に読み込んで使用し、よく知られたインターフェイスにキャストできる(リフレクションを介して)型を作成します。これは、強く型付けされた言語と事前バインディングの利点を維持しながら、外部参照を緩める適切な方法です。

アセンブリをご覧ください。アセンブリをロードする AppDomain クラス、およびアクティベーターを使用して、名前でタイプインスタンスを作成します。

リフレクションを使用できます:

// Load the assembly
Assembly assembly = Assembly.LoadFrom(@"c:\path\Tools.dll");
// Select a type
Type type = assembly.GetType("Tools.Utility");
// invoke a method on this type
type.InvokeMember("SomeMethod", BindingFlags.Static, null, null, new object[0]);

リフレクションを使用して、参照していることを実行できます。実行時にアセンブリをロードし、それを反映してクラスなどを取得し、動的に呼び出すことができます。

個人的には、カップリングを避けるためにこれを行いません。私にとってそれはリフレクションの不適切な使用であり、そうしない特別な理由がない限り、それをプロジェクトに追加して参照したいです。 Reflectionはシステムにオーバーヘッドを追加するため、コンパイル時の安全性の利点が得られません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top