0

我使用MVC3-Entity Framework创建了一个项目。我喜欢和它一起使用存储库模式。我是存储库模式的新手。我是否需要为每个模型类(代表数据库中每个表的类)创建一个每个存储库,并且在每个存储库中我是否必须编写插入、更新、删除和获取记录的所有函数

4

3 回答 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);

http://www.remondo.net/repository-pattern-example-csharp/

于 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 回答