以下の UnitOfWork クラスの使用を改善する方法を調べるのは興味深いことです。ご覧のとおり、現在 UnitOfWork インターフェイスがないため、MVC コントローラーでこれを使用する場合、コントローラーをこのクラスに依存させる新しいオブジェクトを作成する必要があります。
Ninject を使用して、コントローラーのコンストラクターにインターフェイスを渡すことにより、この依存関係を注入できるようにしたいと考えています。私の問題は、このクラスが現在、オープン/クローズドの原則を満たしていないことです。改善方法に関する誰かの提案に興味があります。それ。リポジトリをこの作業単位に渡す何らかの方法も必要だと思いますが、その方法については完全にはわかりません。
どんな助けでも感謝します、ありがとう。
/// <summary>
/// The unit of work maintains the list of repositories and coordinates changes using the EF CodeFirst data context.
/// This will remove concurrency issues with multiple repositories initialising new contexts within the same HTTP request scope.
/// Instead all transactions are done through the unit of work and that is used to call SaveChanges on the DbContext.
/// </summary>
public class ERSUnitOfWork : IDisposable
{
private ERSDbContext context = new ERSDbContext();
private GenericRepository<Recipe> recipeRepository;
private GenericRepository<Member> memberRepository;
private GenericRepository<Course> courseRepository;
private GenericRepository<Cuisine> cuisineRepository;
private GenericRepository<Review> reviewRepository;
public GenericRepository<Recipe> RecipeRepository
{
get
{
if (this.recipeRepository == null)
{
this.recipeRepository = new GenericRepository<Recipe>(context);
}
return recipeRepository;
}
}
public GenericRepository<Member> MemberRepository
{
get
{
if (this.memberRepository == null)
{
this.memberRepository = new GenericRepository<Member>(context);
}
return memberRepository;
}
}
public GenericRepository<Course> CourseRepository
{
get
{
if (this.courseRepository == null)
{
this.courseRepository = new GenericRepository<Course>(context);
}
return courseRepository;
}
}
public GenericRepository<Cuisine> CuisineRepository
{
get
{
if (this.cuisineRepository == null)
{
this.cuisineRepository = new GenericRepository<Cuisine>(context);
}
return cuisineRepository;
}
}
public GenericRepository<Review> ReviewRepository
{
get
{
if (this.reviewRepository == null)
{
this.reviewRepository = new GenericRepository<Review>(context);
}
return reviewRepository;
}
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
/// <summary>
/// Calls dispose on the DbContext, giving a disposing argument
/// to distinguish from the public Dispose method that is required for the IDisposable interface
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
/// <summary>
/// Calls the custom UnitOfWork Dispose() function instead and tells the garbage collector
/// to suppress finalisation of the object, i.e. freeing up its resources
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}