gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:09 26 4
gpt4 key购买 nike

假设我有以下实现:

//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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com