我正在使用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个上下文类实例以进行两次插入是否合适?如果不是我应该考虑使用/实施另一种模式吗?
答案 0 :(得分:1)
你应该使用IoC(DI)容器。这将帮助您在整个项目中使用整个上下文的1个实例。您还可以查看serviceLocator模式的方式,但我会重新使用IoC(DI)容器。我喜欢Castle.Windsor(DI模式的实现),你也可以看看Ninject。