我使用 MVC3 - Entity Framework 创建了一个项目。我喜欢与它一起使用Repository Pattern。我是存储库模式的新手。我是否需要为每个模型类创建 ONE EACH存储库(表示数据库中每个表的类),并且在每个存储库中我是否必须编写所有将插入,更新,删除和获取记录?
答案 0 :(得分:0)
您可以创建具有通用方法的公共存储库,所有其他存储库将是它的子级:
public class MyModelRepository : GenericRepository<MyModel>
{
// extend
}
var MyModelRepository = new MyModelRepository();
请参阅this,或google查看“Generic Repository”:)。如果您不需要某些模型存储库的扩展功能,那么您甚至可以不创建存储库类,而是执行以下操作:
var MyModelRepository = new GenericRepository<MyModel>();
答案 1 :(得分:0)
有一个表示每个存储库之间的公共操作的接口。即插入,更新,删除和获取:
public interface IRepository<T>
{
void Insert(T entity);
void Delete(T entity);
void Update(T entity);
void Fetch(T entity);
}
public class Repository<T> : IRepository<T>
/// your implementation
}
然后在每个模型中,您可以定义适合上下文的存储库,例如:
var repository1 = new Repository<ModelType>(dataContext);
repository1.Insert(obj);
var repository2 = new Repository<DifferentModelType>(dataContext);
repository2.Fetch(objects);
答案 2 :(得分:0)
不,不。您可以为所有类实现GenericRepository,然后在需要添加函数时覆盖它。首先,我要告诉你工作单位。通过此类,您可以访问所有存储库。我在这个例子中添加了一个通用和一个覆盖:
public class UnitOfWork
{
FBDbContext context = new FBDbContext();
public FBDbContext Context { get { return context; } }
private BlockRepository BlockRepository;
private GenericRepository<Category> CategoryRepository;
#region RepositoryClasses
public IBlockRepository blockRepository
{
get
{
if (this.BlockRepository == null)
this.BlockRepository = new BlockRepository(context);
return BlockRepository;
}
}
public IGenericRepository<Category> categoryRepository
{
get
{
if (this.CategoryRepository == null)
this.CategoryRepository = new GenericRepository<Category>(context);
return CategoryRepository;
}
}
#endregion
public void Save()
{
context.SaveChanges();
}
}
然后你有了通用存储库:
public class GenericRepository<TEntity>
{
internal FBDbContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(FBDbContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual TEntity Create()
{
return Activator.CreateInstance<TEntity>();
}
public IQueryable<TEntity> GetAll()
{
return dbSet;
}
//And all the functions you want in all your model classes...
}
以及要覆盖通用存储库的示例:
public class BlockRepository : GenericRepository<Block>
{
public BlockRepository(FBDbContext context) : base(context) { }
public IEnumerable<Block> GetByCategory(Category category)
{
return context.Blocks.Where(r => r.CategoryId == category.Id);
}
}