ef dbcontextとninject
-
26-10-2019 - |
質問
私は、私が組合の2つのエンティティのコレクションであるときに、デフォルトの平等比較がうまくいかなかった理由について、しばらく前に質問しました。
EF Code First -Linq to Entities Union EqualityComperer
答えは、DBContextの2つの違いインスタンスを使用していたため、参照が異なるためでした。
だから今、私はリクエスト全体でDBContentを共有しようとしています。いくつかの「複雑な」例が見られますが、もっと簡単な解決策を試してみると思いました。
そこで、私は自分のエンティティの概要を単純に概説するidbcontextインターフェイスを作成しました
public interface IDbContext {
int SaveChanges();
DbSet<News> News { get; set; }
DbSet<Category> Categories { get; set; }
}
私のdbcontextは次のように実装されます。
public class SiteContext : DbContext, IDbContext {
public DbSet<News> News { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
...
}
}
次に、2つのリポジトリ(NewsRepositoryとCategoryRespository)で、IDBContextをコンストラクターパラメーターとして持っています
IDbContext _db;
public NewsRepository(IDbContext db) {
_db = db;
}
だから今、私はリクエスト範囲でIDBContextにSiteContextにバインドすると、私のリポジトリが同じコンテキストを共有すると思いますか?
kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();
しかし、前の質問から再び組合を試してみると、まだ重複したエンティティを受け取ります!私が間違っていることは何ですか? 1つのリクエストで同じコンテキストを間違いなく使用しているかどうかはどうすればわかりますか?
解決
各リポジトリが構築されると、ninject willはリポジトリごとにSiteContextの新しいインスタンスを提供しているためです。それが機能していない理由です。すべてのリポジトリが同じコンテキストを使用することを意味する、unitofworkの実装を使用することをお勧めします。
Unitofworkは、建設時にidbcontextを取り入れます。
このようなものはうまくいくでしょう
private IDbContext _context;
public UnitOfWork(IDbContext context)
{
_context = context
}
private _INewsRepository;
public INewsRepoitory
{
get{
if(_INewsRepository == null)
{
_INewsRepository = new NewsREpository(_context);
return _INewsRepository;
}
else
{
return _INewsRepository;
}
}
他のヒント
Feanzの解決策を改善するために、私はまだninjectを使用してInewsRepositoryの財産注入を行います。
[Inject]
public INewsRepository NewsRepo {get;set;}
iunitofworkが作成されるたびに、InewsRepositoryが作成しています。これは、ニッジバインディングにまだ追加する必要があります。