我使用MVC3-Entity Framework创建了一个项目。我喜欢和它一起使用存储库模式。我是存储库模式的新手。我是否需要为每个模型类(代表数据库中每个表的类)创建一个每个存储库,并且在每个存储库中我是否必须编写插入、更新、删除和获取记录的所有函数?
问问题
1853 次
3 回答
0
您可以创建具有通用方法的公共存储库,所有其他存储库将是它的子级:
public class MyModelRepository : GenericRepository<MyModel>
{
// extend
}
var MyModelRepository = new MyModelRepository();
看到这个,或谷歌“通用存储库”:)。如果您不需要某些模型存储库的扩展功能,那么您甚至可以不创建存储库类,而是执行以下操作:
var MyModelRepository = new GenericRepository<MyModel>();
于 2013-07-02T09:20:21.137 回答
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);
于 2013-07-02T09:21:24.293 回答
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);
}
}
于 2013-07-02T09:27:28.677 回答