私のサービスレイヤーUnitOfWork
では、コンストラクターにと2つのリポジトリーを挿入しました。作業ユニットとリポジトリにはDbContext
、2人の間で共有したいインスタンスがあります。Ninjectでそれを行うにはどうすればよいですか?どのスコープを考慮する必要がありますか?
私はWebアプリケーションを使用していないため、を使用できませんInRequestScope
。
私は似たようなことをしようとしています...そして私はDIを使用していますが、UoWをDispose
dにして、このように作成する必要があります。
using (IUnitOfWork uow = new UnitOfWorkFactory.Create())
{
_testARepository.Insert(a);
_testBRepository.Insert(b);
uow.SaveChanges();
}
編集:私は理解していることを確認したいだけです... https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScopeを見てから、実際にNinjectを使用している現在のコンソールアプリケーションアーキテクチャについて説明します。
まあ言ってみれば :
クラスAはサービスレイヤークラスです
クラスBは、パラメーターにインターフェース(IContextFactory)を取り込む作業単位です。
クラスCは、パラメーターにインターフェース(IContextFactory)を取り込むリポジトリーです。
ここでの考え方は、2つ以上のリポジトリでコンテキスト操作を実行し、作業単位を使用して変更を適用できるようにすることです。
クラスDは、クラスBとCの間で共有されるコンテキストのインスタンス(コンテナーに保持)を提供するコンテキストファクトリ(Entity Framework)です(..他のリポジトリーにも使用されます)。
コンテキストファクトリはインスタンスをコンテナに保持するため、サービス操作の最後にコンテキストを破棄する必要があるため、このインスタンスをすべての名前で再利用したくありません。これがInNamedScopeの主な目的ですか?
解決策は次のようになりますが、私はそれを正しく行っているかどうかはまったくわかりません。サービスインスタンスは一時的であり、実際には破棄されないということですか?:
Bind<IScsContextFactory>()
.To<ScsContextFactory>()
.InNamedScope("ServiceScope")
.WithConstructorArgument(
"connectionString",
ConfigurationUtility.GetConnectionString());
Bind<IUnitOfWork>().To<ScsUnitOfWork>();
Bind<IAccountRepository>().To<AccountRepository>();
Bind<IBlockedIpRepository>().To<BlockedIpRepository>();
Bind<IAccountService>().To<AccountService>().DefinesNamedScope("ServiceScope");
Bind<IBlockedIpService>().To<BlockedIpService>().DefinesNamedScope("ServiceScope");