1)私はASP.NET MVCアプリケーションを作成していて、簡単なサービスと共にアプリケーション自体にDbContext
を使用したい階層化されたアーキテクチャに少し似ています。Ninjectはコントローラーの依存関係を解決できませんが、サービスに問題はありません
だから、私は標準NinjectWebCommon
ブートストラップに依存関係を登録しています:
kernel
.Bind<IDbContextFactory<WebDbContext>>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
予想通り、それはそのコンストラクタでIDbContextFactory<WebDbContext>
依存して、いくつかのMyService
クラスを初期化する場合には、動作します。デバッグでは、初期化されたインスタンスが表示されます。
ただし、MyController
に同じ依存関係のコンストラクタがある場合、Ninjectは依存関係が登録されていないという例外をスローします。
ええと、なぜですか?
2)とカーネルの初期化は以下の通りです:
var kernel = new StandardKernel();
try
{
kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(kernel));
DependencyResolver.SetResolver(new AppDependencyResolver(kernel));
return kernel;
}
...
RegisterServices()
方法は依存登録することを含んでいるので、私は、たとえば、コントローラの工場に渡されたとき、カーネルはすでにそれを持っていると仮定します。
3)さらにもう1つ。 DBコンテキスト・ファクトリは、初期化時にMyController
がプルする唯一の依存性ではありません。私はMyController
でIDbContextFactory
の依存を回避する場合
kernel.Bind<MyService>().ToSelf().InRequestScope();
だから、それは他の依存関係に問題を持っていない:カップルのようにあります。
4)また別のことです。可能な回避策はこれにDBコンテキストファクトリの登録を変更することである。
kernel
.Bind<IDbContextFactory<WebDbContext>, WebDbContextFactory>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
Bind()
お知らせ方法における第二のタイプ。もちろん、対応する変更はMyController
コンストラクタにあります。しかし、WebDbContextFactory
は実際にはWebDbContextFactory : IDbContextFactory<WebDbContext>
です。それが違う唯一の方法は、私のローカルアセンブリ(別の参照されたプロジェクトだが)にあり、IDbContextFactory<>
は外部のアセンブリであるということだ。ハァッ?