我正在ASP.NET MVC 4
从头开始做项目。我决定从数据访问层的使用Entity Framework 5
和Code First
工作流程开始。我以前工作的公司正在使用非常好的实现(在我看来),Repository pattern
包括存储库、服务、存储库和服务的抽象工厂Unity
以及DI
. 我试图重做它,但它对我来说太复杂了,并且会花费我很多时间来复制我一直在那里使用的东西,所以我决定做一些研究并选择更轻的东西。
所以我决定使用GenericRepository
and UnitOfWork
- 与最初的计划相去甚远,但那是在我的大多数搜索中显示的实现。所以我做了一个非常基本的实现(直到我确定我知道发生了什么,甚至可能低于我的理解能力)实际上我认为对于这个确切的项目来说它可能就足够了,但我想要的是能够在不同的实体上调用其他自定义方法。
我认为这从泛型存储库的想法中得到了很多,但是如果我尝试使用其他一些实现,它会变得更加困难,所以我想知道是否有一种方法可以将它添加到我的实现中,而不会过多地伤害泛型背后的想法存储库。
我现在拥有的是GenericRepository
课程:
public class GenericRepository<TEntity> where TEntity : class
{
internal DBContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(DBContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get()
{
IQueryable<TEntity> query = dbSet;
return query.ToList();
}
//just the standard implementation
和我的UnitOfWork
班级:
public class UnitOfWork : IDisposable
{
private DBContext context = new DBContext();
private CustomerRepository customerRepository;
public CustomerRepository CustomerRepository
{
get
{
if (this.customerRepository == null)
this.customerRepository = new CustomerRepository(context);
return customerRepository;
}
}
private GenericRepository<Order> orderRepository;
public GenericRepository<Order> orderRepository
{
get
{
因此,您可能会看到我的Order
实体正在使用,GenericRepository
但我创建了一个测试类CustomerRepository
来用于我的Customer
实体。
现在这个类CustomerRepository
看起来像这样:
public class CustomerRepository : GenericRepository<Customer>
{
public CustomerRepository(DBContext context) : base(context) { }
}
这个想法是在Customer
此处添加显式用于实体的方法。我不确定这是否正确,尤其是我调用构造函数的方式。但是,为不同实体添加这些特定方法的自然方法是什么?我什至不介意后退一步以更好地实施它,但我不想匆忙,因为我尝试过,目前整个概念对我来说太复杂了,我想确保我理解这些事情我在我的代码中使用。