在EF Generic Repository中处理Context

时间:2011-08-10 05:27:20

标签: entity-framework repository datacontext dispose

我有以下通用存储库:

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子句中而不是在构造函数中创建存储库,但我想知道是否有更优雅的方式。

也可以随意评论设计。

2 个答案:

答案 0 :(得分:2)

这是完全错误的。您正在存储库之外创建上下文,因此存储库不负责处置。为处理构造存储库的层= BaseBLL必须是一次性的,上层必须在不再需要它时正确处理它。

答案 1 :(得分:2)

用UnitOfWork包装Dbcontext并在UnitOfWork内部实现dispose方法。

参考:http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/