c# - MVC 通用存储库/工作单元模式 - 扩展存储库

标签 c# asp.net-mvc entity-framework repository-pattern unit-of-work

假设我有以下实现:

//Generic repository.
public interface IRepository<T> where T : class {
   void Insert(T entity);
   void Delete(int id);
   void SaveChanges();
   //..more generic functions
}

//Repository implementation.
public class EFRepository<T> : IRepository<T> where T: class {
   private MyDbContext context;
   protected DbSet<T> dbSet;

   public EFRepository(): this(new MyDbContext()){}

   public EFRepository(MyDbContext context)
   {
      this.context = context;
      dbSet = context.Set<T>();
   }

   public void Insert(T entity)
   {
      dbSet.Add(entity);
   }

   public void Delete(int id)
   {
      dbSet.Remove(dbSet.Find(id));
   }

   public void SaveChanges()
   {
      context.SaveChanges();
   }
   //...more generic implementations
}

//Unit of Work Interface
public interface IUnitOfWork: IDisposable
{
   IRepository<EntityA> ARepository { get; }
   IRepository<EntityB> BRepository { get; }
   //...more stuff
}

//Unit of Work Implementation
public class EFUnitOfWork: IUnitOfWork
{
   private MyDbContext context = new MyDbContext();

   private IRepository<EntityA> aRepository;
   private IRepository<EntityB> bRepository;

   public IRepository<EntityA> ARepository 
   {
      get
      {
            if (this.aRepository == null)
               this.aRepository = new EFRepository<EntityA>(context);

            return this.aRepository;
      }

   }

   public IRepository<EntityB> BRepository 
   {
      get
      {
            if (this.bRepository == null)
               this.bRepository = new EFRepository<EntityB>(context);

            return this.bRepository;
      }

   }

   //...more stuff
}

最后,我的解析器中有以下绑定(bind):

kernel.Bind(typeof(IRepository<>)).To(typeof(EFRepository<>));
kernel.Bind(typeof(IUnitOfWork)).To(typeof(EFUnitOfWork));

现在,我的问题是......我将如何扩展 EntityA 的存储库,使其拥有比通用操作更多的操作?

我会在几小时后发布我到目前为止的内容...

编辑:这是我目前所拥有的:

//New interface.
public class IEntityARepository : IRepository<EntityA>
{
   void DoSomethingSpecificToEntityA();
}

//New implementation.
public class EFEntityARepository : EFRepository<EntityA>
{
   public EFEntityARepository(MyDbContext context) : base(context) {}
   //add additional methods for EntityA
   public void DoSomethingSpecificToEntityA()
   {

   }

}


//Modify Unit of Work Interface as follows.
//Unit of Work Interface
public interface IUnitOfWork: IDisposable
{
   IEntityARepository  ARepository { get; }
   IRepository<EntityB> BRepository { get; }
   //...more stuff
}

//Modify Unit of Work Implementation as follows.
public class EFUnitOfWork: IUnitOfWork
{
   private MyDbContext context = new MyDbContext();

   private IEntityARepository  aRepository;
   private IRepository<EntityB> bRepository;

   public IEntityARepository   ARepository 
   {
      get
      {
            if (this.aRepository == null)
               this.aRepository = new EFEntityARepository<EntityA>(context);

            return this.aRepository;
      }

   }

   public IRepository<EntityB> BRepository 
   {
      get
      {
            if (this.bRepository == null)
               this.bRepository = new EFRepository<EntityB>(context);

            return this.bRepository;
      }

   }

   //...more stuff
}

添加以下绑定(bind):

kernel.Bind(typeof(IEntityARepository)).To(typeof(EFEntityARepository));

但是,我敢肯定这是不正确的。或者至少,这不是正确的方法。

最佳答案

如果我理解正确的话,您可以像这样从泛型类的特定类型版本派生...

public class EFEntityARepository : EFRepository<EntityA>, IEntityARepository 
{
    //Add more opps
}

我认为工作单元应该是这样的:

   public IEntityARepository   ARepository 
   {
      get
      {
            if (this.aRepository == null)
               this.aRepository = new EFEntityARepository(context);

            return this.aRepository;
      }

   }

关于c# - MVC 通用存储库/工作单元模式 - 扩展存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956841/

相关文章:

c# - 使用 XNA 绘制带纹理的四边形

c# - WPF 桌面应用程序,Windows 10 Notification Toast 2016(UWP 社区工具包)

c# - 使用 RegEx 对字符串进行大写和小写

c# - 尝试将 EF 6 与 PostgreSQL 一起使用 - 无法找到或加载已注册的 .Net Framework 数据提供程序

entity-framework - 如何将 ADO.net Entity Framework 与现有的 SqlConnection 一起使用?

.net - 如何在 Entity Framework 中使用枚举?

c# - 从另一个文件访问私有(private)类

asp.net - Asp.NET MVC 5 Entity Framework 中的无效对象名称 'dbo.AspNetUsers'

c# - 强制将 ASP.NET MVC3 和 Entity Framework 4 属性转换为大写

MVC 升级后 Javascript 功能不起作用