1

Entity Framework (DbContext) を使用する共有ライブラリがあります。このライブラリは、通常の Windows アプリケーションだけでなく、Web MVC プロジェクトでも使用されます。DIとしてNinjectを使用しています。

Windows アプリケーションおよびMVC プロジェクトで使用InThreadScopeする必要があることは、私の理解です。DbContextInRequestScope

ただし、これにより、不要な依存関係がいくつか作成されます。私の共有ライブラリには、System.Web(リクエストのスコープのために)への参照が必要です。または、私の Web プロジェクトには EF への参照が必要です (スコープを変更できるようにするため)。

これらの依存関係を回避するような方法で Ninject をセットアップすることは可能ですか?

4

3 に答える 3

0

わかりましたので、図を作成しました。 バインディング依存関係を仲介者に移動する 多くの場合、UnitOfWork のような「データベース セッション」の表現を使用します。したがって、共有ライブラリ「SomeLib」がセッションを表す IUnitOfWork を提供する場合、1:1 バインディング IUnitOfWork:DbContext @ SomeLib を作成し、アプリケーションでより具体的なバインディングを作成できます。

于 2013-07-16T14:38:41.517 に答える
0

さらに別の可能な解決策は次のとおりです。

SomeLib で、DbContext のバインディングを次のように定義します。

this.Bind<DbContext>().ToSelf()
    .InScope(ctx => ctx.Kernel.Get<IDbContextScopeRetriever>().Retrieve());`

スコープ取得機能を使用する 次に、アプリケーションで のそれぞれの実装を作成してバインドしIDbContextScopeRetrieverます。

の実装は次のThreadDbContextScopeRetrieverようになります。

object Retrieve() {
    return System.Threading.Current;
}
于 2013-07-16T14:49:25.443 に答える
0

NinjectModulesのような新しいプロジェクトを作成することをお勧めします。バインディングの宣言をWinAppModuleMvcModuleなどの個別のモジュールに移動し、 NinjectModulesプロジェクトに配置します。次に、win app プロジェクトと mvc プロジェクトからNinjectModulesを参照します。EF などを参照する必要はありSystem.Webません。

アップデート

モジュール図 同様の質問で私の答えを見ることができます。

于 2013-07-16T07:34:24.587 に答える