5

この比較的小さなプロジェクトで Ninject の使用を開始しましたが、問題が発生しました:私はこのクラスを持っています

class SomeService : ISomeService 

それはに依存します

class BizLogicModule : IBizLogicModule

それは次に依存します

class DataRepository : IDataRepository

これにDataRepositoryは、次のような ctor があります。

DataRepository(BizEntityModel context)

BizEntityModelここで、複数のインスタンスにわたって単一のインスタンスを使用できるようにする必要がありIDataRepositoryます。また、 の寿命に沿って
を作成する必要があります。はNinjectについて知らないので、そのままにしておきたいです。IDataRepositoryIBizLogicModuleIBizLogicModule

だから私の問題は: Ninject カーネルを使用して、すべてを接続する方法です:

  1. レイヤー間でカーネル インスタンスを渡す必要はありません。

  2. 以前のNinjectに近いコードを読みやすいままにします(私はファクトリメソッドを使用して新しくしただけです)。

これまでに得た配線の簡単な部分は次のとおりです。

Bind<SomeService>().To<ISomeService>();
Bind<BizLogicModule>().To<IBizLogicModule>();
Bind<DataRepository>().To<IDataRepository>(); 
Bind<BizEntityModel>().To<BizEntityModel>(); //ToSelf()
// .WithConstructorArgument(context => Kernel.Get<BizEntityModel>)

ご指導よろしくお願いします

編集:あなたの答えをありがとう!
リクエストされたデータは次のとおりです: BizEntityModelNinject に登録されています (コードが更新されました)。

私が正しく理解していれば、「ファクトリーメソッド」を使用してIDataRepositoryinのインスタンスを作成できます。IBizLogicModuleしかし、それは私に次のことを残します:
1)ファクトリーメソッドにaを渡す必要がありBizEntityModelます。場合によってはそのふすまが新しく、場合によっては既存のインスタンスです。ファクトリ メソッドを使用すると、毎回新しく作成されます。
2)これは別のアセンブリにある問題でSomeServiceあり、Ninject.dll への参照があるだけですか?

4

3 に答える 3

2

私はそれを理解したように質問を繰り返します:

  1. BizLogicModule インスタンスごとに 1 つの BizEntityModel インスタンスが存在します (相互参照はありません)。

  2. BizLogicModule が DataRepository を作成するたびに、この BizEntityModel が再利用されます

  3. いくつかの BizLogicModules があります

これが正しければ、NamedScope 拡張ドキュメントの 2 番目の例が適しているはずです。https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScopeを参照してください

この拡張機能の完全なドキュメントを必ずお読みください: https://github.com/ninject/ninject.extensions.namedscope/wiki

于 2011-03-30T18:16:05.623 に答える
1

BizEntityModel を Ninject に登録しますか? その場合、BizEntityModel の従来のシングルトン インスタンスを定義して登録することなく、コンテナーまたはプログラムの有効期間のすべての要求に対して、BizEntityModel のインスタンスを 1 つだけ提供するように Ninject に指示できるはずです。ファクトリ メソッドを使用する必要があり、Ninject でその登録をシングルトン スコープにできない場合でも、必要に応じて、オブジェクトを熱心にロードし、依存関係のインスタンスをシングルトンとして登録できます。

IBizLogicModule は Ninject について知る必要はありません。Ninject は BizLogicModule について知っている必要があります。ファクトリ メソッドを提供する IDataRepository 登録を作成してみてください (ファクトリ スコープであるため、呼び出しごとに新しいインスタンスが作成されます)。次に、そのファクトリ メソッドを依存関係として IBizLogicModule に渡します。これにより、IDataRepositories を作成する必要があるときにそれが使用されます。基本的に、IoC の解決機能を通過して、IBizLogicModule でファクトリ クラスを提供します。IBizLogicModule のさまざまなクラス タイプに対してこれを行うと、基本的にサービス ロケーターを作成することになりますが、これは個人的には避けたいと思いますが、1 つまたは 2 つが完全に有効な Factory/Creator パターンです。

于 2011-03-30T17:04:27.633 に答える
0

IDataRepository以下の回答は、 in oneの多くのインスタンスを解決する方法を尋ねていることを前提としていますIBizLogicModule。そうでなければ、この質問は簡単すぎるでしょう:-)

通常、優れた IoC コンテナーには、Factory/Factory メソッドを注入する機能があります。私はNInjectの経験があまりなく、他のコンテナーについて知っているほど良い解決策を見つけていませんが、主なタスクをどのように達成できるかの例をここで見ることができます。ここでの唯一の問題は、独自にファクトリを実装してIResolutionContextそこにプルする必要があることですが、とにかくこのファクトリにより、残りのコード ( IBizLogicModule) を IoC 固有のものから分離できるようになりますIDataRepositoryFactory

于 2011-03-30T17:27:16.993 に答える