在Generic Repository中重用DbContext

时间:2013-02-14 14:34:25

标签: c# generics frameworks repository entity

我正在使用Entity Framework 5.0实现存储库模式 - 至少我认为我是:)。这就是我正在使用的

public abstract class GenericRepository<C, T> :
 IGenericRepository<T>
    where T : class
    where C : DbContext, new()
{
    private bool disposed = false;
    private C _entities = new C();
    protected C Context
    {
        get { return _entities; }
        set { _entities = value; }
    }

    public virtual IQueryable<T> GetAll()
    {
        IQueryable<T> query = _entities.Set<T>();
        return query;
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        IQueryable<T> query = _entities.Set<T>().Where(predicate);
        return query;
    }

    public virtual void Add(T entity)
    {
        _entities.Set<T>().Add(entity);
    }

    public virtual void Delete(T entity)
    {
        _entities.Set<T>().Remove(entity);
    }

    public virtual void Edit(T entity)
    {
        _entities.Entry(entity).State = System.Data.EntityState.Modified;
    }

    public virtual bool Save()
    {
        return (_entities.SaveChanges() > 0);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
            if (disposing)
                _entities.Dispose();

        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

之后这个类由特定的存储库类继承 - 比方说PlaceRepository

public class PlaceRepository : GenericRepository<DbEntities, Place>, IPlaceRepository
{ }

在另一层(业务层)中,我正在创建PlaceRepository类的实例 - 在名为PlaceController的类中。此类具有PlaceEntity(CRUD)的特定方法。在这个PlaceController中,我有一个方法用于在数据库中插入Place实体,但同时我在另一个表中插入一些东西(比方说Country表)。对于Country表上的CRUD操作,我有另一个名为CountryRepository的存储库。

总而言之,我在Place Controller中的方法创建了两个不同存储库的实例,以使用它们的方法,从而创建两个不同的DbContext上下文。见下面的代码

public class PlaceController 
{ 
   public bool InsertPlace(Place toInsert)
   {
      PlaceRepository _placeRepo = new PlaceRepository();
      _placeRepo.Add(toInsert);

      Country _country = new Country();

      _country.Name = "default";

      CountryRepository _countryRepo = new CountryRepository();

      _countryRepo.Add(_country);

     //now i must call save on bothRepositories
     _countryRepo.Save(); _placeRepo.Save();

}
}

我需要对此方案有意见。创建2个上下文类实例以进行两次插入是否合适?如果不是我应该考虑使用/实施另一种模式吗?

1 个答案:

答案 0 :(得分:1)

你应该使用IoC(DI)容器。这将帮助您在整个项目中使用整个上下文的1个实例。您还可以查看serviceLocator模式的方式,但我会重新使用IoC(DI)容器。我喜欢Castle.Windsor(DI模式的实现),你也可以看看Ninject。