我正在阅读以下关于在asp.net mvc&中创建Generic Repository Link的教程。 EF,执行CRUD操作,如下: -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.Entity;
using ContosoUniversity.Models;
using System.Linq.Expressions;
namespace ContosoUniversity.DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SchoolContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SchoolContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
public virtual TEntity GetByID(object id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
}
}
但在实际的Web项目中,添加/编辑/删除/查找操作可能不是非常简单和标准,因为不同的实体可能需要在这些方法中进行不同的操作。
目前在我的资产管理asp.net mvc Web应用程序中,例如我有一个存储库方法来添加新的Server实体,我在其中执行以下主要操作: -
因此我发现很难为几乎所有当前的存储库方法创建Generic存储库,因为每个实体在执行CRUD操作时都有不同的要求。
所以我的问题基本上是,当开发具有不同且复杂要求的Web应用程序时,通用存储库是否可以实现任务?从我的观点来看,只有在要求简单且标准的情况下,才能使用通用存储库。
或者我应该将我的存储库和操作方法设置为使用Generic存储库,否则可能会出现问题?
有人可以就此提出建议吗?
由于
答案 0 :(得分:2)
为什么我们要使用通用存储库?因为我们有共同的要求,我们希望用较少的代码重复来实现。如果我们的存储库的需求不符合这种常见模式,该怎么办?然后我们不会尝试将此存储库强制为不适合的模式。
设计模式的目的是在需求符合模式的情况下提供一些可能的通用解决方案。目的不是停止思考设计而不是试图强迫一切成为一种模式。
答案 1 :(得分:1)
我在我的应用程序中使用了通用存储库模式。它让我实现了对组织依赖实体的过滤,软删除和撤销 - 所有这些都没有代码重复。如果我需要添加审核,那么我会将其添加到我的通用存储库中,并确信所有实体都将被审核。就我而言,创建通用存储库让我添加了DbSet<T>
实现中不存在的非常复杂的行为。
当我对实体有其他或不同的要求时,我会继承通用存储库并添加或覆盖子类中的行为。这让我也可以添加非常复杂的要求。
DbContext/DbSet<T>
是工作单元/存储库模式的简单实现,但是将它包装在我自己的模式中帮助我用最少的代码添加复杂的需求。