我有以下通用存储库:
public class EFRepository<TEntity, TContext> : IRepository<TEntity, TContext>, IDisposable
where TEntity : class
where TContext : ObjectContext
{
protected TContext context;
public EFRepository(TContext context)
{
this.context = context;
}
//CRUD methods...
public void Dispose()
{
if (null != context)
{
context.Dispose();
}
}
}
这是业务层的一个类
public class UserBLL : BaseBLL<User>
{
EFRepository<User, MyEntities> userRepo = null;
public UserBLL() : base ()
{
//Context is created in the consructor of the base class and passed to repository
userRepo = new EFRepository<User, MyEntities>(Context);
}
}
以下是基础业务类:
public class BaseBLL <TEntity>
where TEntity : class
{
protected MyEntities Context { get; set; }
public BaseBLL()
{
this.Context = DataAccessHelper.Context;
this.Context.MetadataWorkspace.LoadFromAssembly(typeof(TEntity).Assembly);
}
}
在此设计中,由于我在业务类构造函数中而不是在using子句中创建存储库的实例,因此默认情况下不会调用存储库的dispose方法。我的主要问题是如何确保处理上下文/存储库。
我知道我可以在每个方法中的using子句中而不是在构造函数中创建存储库,但我想知道是否有更优雅的方式。
也可以随意评论设计。
答案 0 :(得分:2)
这是完全错误的。您正在存储库之外创建上下文,因此存储库不负责处置。为处理构造存储库的层= BaseBLL
必须是一次性的,上层必须在不再需要它时正确处理它。
答案 1 :(得分:2)
用UnitOfWork包装Dbcontext并在UnitOfWork内部实现dispose方法。