1

Javaのjava.util.ServiceLoaderに類似しているため、コンポーネントをSPIで動的に参照してロードすることができますか?.NETのSPI/ServiceProvider? (軽量IoC)

私は.NETの軽量ネイティブ機能を探しています。これは、大規模なDIコンテナではなく、簡単にインターフェイスのプロバイダをプラグインすることができます。

更新:これは.NETのようにすぐには利用できないようですが、Javaのようなネイティブなビルドイン機能はありません。私は最初の答えを受け入れました。なぜなら、それは私が後にしているものに最も近いからです。

答えて

6

ネイティブIServiceProvider interfaceがあります。言っ

は、.NET

  • 城ウィンザー
  • ユニティ
  • AutoFac
  • NInjectが

数名にするために利用可能な非常に豊富IoCコンテナのトンがあります。これらの多くはかなり軽量です。また、オブジェクトのライフタイム管理(シングルトン、スレッドごとなど)やAOP(アスペクト指向プログラミング)機能などの高度な機能も提供しています。

しかし、あなたが本当に軽量で依存関係がないようにしたい場合は、約30行のうちcodeで自分自身をロールバックすることができます。

+0

ありがとうございました。 IServiceProviderは、(非汎用の?!)インタフェースを除けば、まったく何もしていないようです。私が探しているのは、インターフェイスを作成し、このインターフェイスのプロバイダをクラスパス(アセンブリ?)に配置し、これらを取得できるようにするものです。私が輸出ツールを書いているとしたら、「ねえ、輸出フォーマットを生成できるすべての人のリストが必要です」と叫ぶことができたら、これで列挙子を返すことができます。大規模で複雑なIoCフレームワークを混乱させる必要がないときは、きれいでタイトなパターンです。 –

+1

私はこの場合に30行のコードアプローチを提案します。 – Jeff

0

@ JeffN825によると、これらは.NET用のネイティブコンテナではありません。

これは、かさばるとはどういう意味ですか?おそらく、あなたはService Locatorパターンの主な欠点を指しているでしょう。どこにでもコンテナへの参照があり、かなり侵略的です。

Composition Root patternの助けを借りて、アプリケーションの1つの場所にコンテナの使用を格下げすることができ、コンテナの使用による影響を軽減できます。このようにして、「一括」を削除します。一度設定して、一度使用し、忘れてしまいます。


UPDATE

あなたのコメントに答える:IoCのコンテナの多くは、あなたのニーズを満たすことができる自動登録機能のいくつかの並べ替えを持っています。たとえば、relevant structuremap documentation pageへのリンクがあります。

次に、実際の実装ではなく、実装のさまざまな構成(つまりスタブ)で異なるアセンブリを選択させることができます。

+0

実際には、コンテナは侵襲的な部分として見えます。プラットフォームに組み込まれているため、ビルド・ツールは、クラス・パス(組み込みコンテンツ?)を介して、利用可能なものと利用可能なものを決定させることができます。列車(インターネットアクセスなし)、特定のテストケース、または仮想リソースで作業するときに、私はしばしば実装stubX、stubY、stubZを使用します。 –

+0

@CasperBang私は自分の答えを編集すると答えた –