1

JobContext リゾルバーを作成する Ninject のセットアップがあります。InRequestScope()これは問題なく動作しますが、ウェブサイトに非常に特殊な呼び出しがあり、いくつかのデータベース (年ごとのデータベース内のすべてのデータ) をループする必要があります。JobContext があったことを忘れていたので、何が起こっているのかよくわかりませんでしInRequestScopeたが、コードの最後のブロックが思ったように動作していませんでした。

セットアップはこちら

//Ninject module
Bind<Data.IJobContext>().To<Data.JobContext>().InRequestScope();


//Controller's Initialize
protected override void Initialize(System.Web.Routing.RequestContext requestContext) {
    base.Initialize(requestContext);

    //set a connection string for the jobContext
    this.jobContext = DependencyResolver.Current.GetService<IJobContext>();
    jobContext.SetYear(currentYear);
}

JobContext はリクエスト スコープ内にあるため、毎年同じオブジェクトを再利用し続けます。InTransientScopeこれは、.ではなく必要な唯一の例ですInRequestScope

//Special function
foreach (int year in ActiveYears) {
    jobContext = DependencyResolver.Current.GetService<IJobContext>();
    jobContext.SetYear(year);
    DoSomething();
}

どうすればこれを達成できますか?

4

1 に答える 1

3

出てくる質問の1つは、リクエストスコープでJobContextが本当に必要な場合と、一時スコープでJobContextが必要な場合があります。デザイン臭いようです!次の手順を実行する前に、これを修正してみてください。

説明した方法で本当に実行したい場合は、2つの異なる名前付きバインディングを指定する必要があります。1つは一時的で、もう1つは要求スコープで、名前で取得します。

this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped");
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped");
kernel.Get<IJobContext>("RequestScoped");

もう1つ、NinjectカーネルのServiceLocatorの種類の使用法を取り除き、代わりに依存性注入を使用することをお勧めします。より良いデザインになります。

于 2010-11-15T18:06:32.590 に答える