8

Ninject で配線した依存関係を持つクラスがあります。

public interface IFoo {}

public class MyObject {
    [Inject]
    IFoo myfoo;
}

実際の実装ではプロパティ注入を使用していますが、簡単に説明するために、フィールドに注入します。私が理解しているように、MyObject のインスタンスを新規作成する代わりに、依存関係を適切に注入するために、使用する必要があります

kernel.Get<MyObject>()

しかし、私がつまずいたのは、MyObject はクラス ライブラリのコンテキストでのみ使用されるということです。目的は、エンド アプリケーションが独自のモジュールを作成し、それをカーネル インスタンスに渡してハイドレートすることです。それを考えると、Ninject カーネルのジェネリック インスタンスをクラス ライブラリに提示して、MyObject (および他の同様のケース) のインスタンスをハイドレートできるようにするための最も実用的な方法は何ですか?

私の最初の傾向は、シングルトン カーネルを内部化するある種のファクトリです。アプリケーション自体は、モジュールをロードしてハイドレート/初期化する必要があります。

だからRandomService.csで

var myKernel = NinjaFactory.Unleash();
var myobj = myKernel.Get<MyObject>();
myobj.foo();

ただし、この道を進みすぎる前に、健全性チェックを行って、考え方が正しいこと、または他に見落としている明らかなものがないことを確認する必要があります。私は明らかに IoC の初心者であり、基本を理解しているように感じますが、必ずしもそれを実際に使用するための最良の方法ではありません。

4

3 に答える 3

9

あなたの質問のすべての詳細を理解しているかどうかはわかりませんが、私が理解している限り、Ninject への依存を外部化する方法を尋ねています。

特定の DI コンテナー(Ninject など)を参照することなく、DI に適したライブラリを作成することができます。これにより、ライブラリの利用者は、好みの DI コンテナーを選択できるようになります (または、コンテナーをまったく使用しないこともできます)。この方法は自由度が高いため、非常に好まれます。

ただし、 Property InjectionよりもConstructor Injectionを優先する必要があります。プロパティ インジェクションの実装は一見簡単そうに見えますが、実際には正しく実装するのは非常に困難です。

コンストラクター インジェクションの大きな利点の 1 つは、DI コンテナーが正しく接続するために必要なすべての情報を構造的に既に保持しているため、コンストラクターに属性を配置する必要がないことです。

于 2010-02-11T08:37:46.483 に答える
4

マークのポイントは間違いなく私の出発点です(したがって+1)。NBは彼のリンクをたどることを忘れないでください

私は過去に、プロパティ(またはフィールド)のコンストラクターをすぐに諦めたことで罪を犯しました(私の「言い訳」は、基本クラスに5つのプロパティが必要だったため、すべての派生クラスにそれを負担させたくないということでした。これは、クラスまたはクラスの階層に含まれる5つのプロパティをラップして、プロパティが表す基本的な概念を表すことでした。IntroduceParameterObjectリファクタリングに少し似ています。

私が有用だと思った考慮事項の良い議論はhttp://thinkbeforecoding.com/post/2009/05/15/IOC-container-go-hideです(それとそれに関するいくつかのトピック、多分誰かに言及しているSO投稿を見つけてくださいリンクを挿入します:D)

これらのポイントのいくつかを要約した別のブログは、あなたのIoCコンテナが表示されていることです

そしてhttp://davybrion.com/blog/2009/11/integrating-your-ioc-container-with-agatha/

于 2010-02-11T09:43:47.587 に答える
0

以下は、現在のアセンブリ内のすべての ninject モジュールを見つけるための優れた汎用レシピです。

IKernel _serviceKernel = new StandardKernel();

Assembly myAssembly = this.GetType().Assembly;

IEnumerable<Type> ninjectModuleTypes = 
     myAssembly.GetTypes().Where(type => type.BaseType == typeof(NinjectModule));

foreach (Type ninjectModuleType in ninjectModuleTypes)
{
    NinjectModule mod = (NinjectModule)Activator.CreateInstance(ninjectModuleType);
    _serviceKernel.Load(mod);
}
于 2012-08-23T20:06:33.487 に答える