2012-01-31 6 views
6

最初に、私はpublic class DatabaseFactory : Disposable, IDatabaseFactoryと定義されているdbcontextファクトリを持っています。存在しない場合はコンテキストを作成します。ninjectを使用して単一のファクトリインスタンスを複数のリポジトリと作業単位に挿入する方法はありますか?

次に、コンストラクタでファクトリを取得するpublic class Repository<T> : IRepository<T> where T : classと定義されている汎用リポジトリがあります。私はこれを継承する他の具体的なリポジトリを持っています。

また、コンストラクタ内でファクトリを取得し、すべてのリポジトリが使用するはずのファクトリ内のコンテキストに対するすべての変更を保存する、public class UnitOfWork : IUnitOfWorkと定義されている作業単位クラスもあります。

私のコントローラでは、コンストラクタをpublic ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep)に設定しています。

基本的には、作業単位とすべてのリポジトリに渡す工場の同じインスタンスが必要です。 ninjectを使用すると、単一インスタンスをすべてのオブジェクトに渡すのではなく、オブジェクトごとに新しいファクトリを作成します。単一のインスタンスがninjectを介して渡されるようにする方法はありますか、または工場を正しく作成していないか、またはninjectを正しく理解していませんか?ここで

はninjectで私のバインディングです:

kernel.Bind<IProjectRepository>().To<ProjectRepository>(); 
kernel.Bind<IIssueRepository>().To<IssueRepository>(); 
kernel.Bind<IUserRepository>().To<UserRepository>(); 
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 

答えて

10

デフォルトNinjectTransientスコープ使用しているため、この問題が発生した - 新しいインスタンスにタイプが要求されるたびに作成されます。

詳細情報:あなたはあなたのアプリケーション全体のタイプの特定のインスタンスの実際の使用状況に応じて、範囲を指定する必要がありhttps://github.com/ninject/ninject/wiki/Object-Scopes

は:

例は次のようになります。

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope(); 
+0

本当ですか?過去1時間半の間、その答えを探してみました。それはまさに私が探していたものです。私はなぜそれがGoogleを介してその答えを見つけるのは難しいか分かりません。たぶん私はそれをずっと難しくしようとしていたかもしれません。再度、感謝します! – snoluet

+0

私のポストが役に立つと分かったら、それを答えとして受け入れることができます:) – MonkeyCoder

+0

私はあなたにそれをあまりにも早く答えました。そして今私は4分待たなければなりません:)ありがとう。ファクトリーをシングルトンとして配置すると、秒があるかどうかが簡単にわかります。現在のコントローラー内でのみ、単一のインスタンスアプリケーションを作成しますか? ProjectControllerよりもIssueControllerの工場の別のインスタンスが必要な場合(ただし、その特定のコントローラ内でそのインスタンスが1つだけ)、ninjectがそれを世話しますか? – snoluet

関連する問題