2011-07-08 8 views
15

リポジトリパターンを使用してNinjectで構成されたMVC 3ソリューションがあります。私のバインディングの一部を以下に示します。コンソールアプリケーション用のNinjectの設定とMVCアプリケーション用の既存のリポジトリの活用

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InRequestScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope(); 
kernel.Bind<IMyService>().To<MyService>().InRequestScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

は、私も自分のソリューションにコンソールアプリケーションを追加したと私は同じリポジトリとサービスを活用したいです。マイコンソールのコードがどのように見える

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope(); 
kernel.Bind<IMyRepository>().To<MyRepository>().InSingletonScope(); 
kernel.Bind<IMyService>().To<MyService>().InSingletonScope(); 
kernel.Bind<ILogging>().To<Logging>().InSingletonScope(); 

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(new IoCMapper()); 

    var service = kernel.Get<IMyService>(); 
    var logger = kernel.Get<ILogging>(); 

    ... do some processing here 
} 

これはうまく動作しますが、私はtは私はコンソールアプリケーション用に正しくNinjectを設定していていることを確認してくださいしたいコンソールアプリケーションのための私のNinject構成は次のようになります。コンソールアプリケーションのすべてのバインディングにInSingletonScope()を使用するのは正しいですか?私はそれを異なって構成するべきですか?

答えて

11

アプリケーション全体に対して1つのリポジトリサービスを1つだけインスタンスにしたいですか?その場合は、InSingletonScopeを使用してください。

コンソールアプリケーションはマルチスレッドですか?この場合、各スレッドのサービスの新しいインスタンスが必要な場合は、InThreadScopeを使用します。

呼び出されるたびにサービスの新しいインスタンスが必要な場合は、InTransientScopeに設定します。

また、InScopeを使用して独自のスコープを定義することもできます。 Bob Cravens氏はここにこれらのそれぞれの良い概要を示していますhttp://blog.bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

+0

コンソールアプリケーションには簡単なループがあり、いくつかのURLを繰り返して内容をスクラップし、処理してサービスに渡してデータベースに保存します。非同期リクエストがないので、これでシングルスレッドになると思いますか?このシナリオに最も適したアプローチはどれですか? – Thomas

+0

毎回同じデータベース接続を使用する場合は、InSingletonScopeまたはInRequestScopeを使用できます。同期操作のためにはうまくいくはずです。何らかの理由でデータベースサービスへのリクエストが非同期(UoWシナリオでは一般的)になった場合、同時に2つの異なるコールで使用されているデータベース接続に関する問題が発生する可能性があります。これは数ヶ月前に起こったことで、何が起きているのか理解しようとしています。 –

+0

「データベースサービスへのリクエストが非同期になる」と言うと、私のコードを実際に "非同期にする"これは "フードの下で"発生する可能性がありますか? – Thomas

関連する問題