1

我正在使用 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 个实例以进行两次插入是否很好?如果不是我应该考虑使用/实现另一种模式吗?

4

1 回答 1

1

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

于 2013-02-14T14:54:52.380 回答