为什么工作单元和InRequestScope Ninject创建了2个dbcontext实例?

时间:2015-04-03 15:09:47

标签: c# asp.net-mvc-5 ninject unit-of-work

我正在使用可以访问dbcontext的UnitOfWork,并且在我访问存储库的工作单元内。我的想法是,存储库应该可以访问作为工作单元对象的dbcontext的同一个实例,但事实证明它没有。

 public class PermissionService : IPermissionService
    {
        private readonly IRepositoryBase<PermissionEntity> _repository;
        private readonly ICommonRepository _commonRepository;
        private readonly IUnitOfWorkManager UnitOfWorkManager;


        public PermissionService(IRepositoryBase<PermissionEntity> repository, ICommonRepository commonRepository, IUnitOfWorkManager unitOfWorkManager)
        {
            _repository = repository;
            _commonRepository = commonRepository;
            UnitOfWorkManager = unitOfWorkManager;
        }
.....
    public void AddNewPermission(PermissionEntity permission) { 
        using (var unitOfWork = UnitOfWorkManager.NewUnitOfWork()) { 
            try  {
                _repository.Add(permission);
                unitOfWork.Commit();
            }
            catch (Exception ex)
            {
                unitOfWork.Rollback();
            }
        }
    }

每个接口都通过使用InRequestScope选项绑定到Ninject的实现。

有人可以解释我做错了吗?

更新 - 更多详情

public IUnitOfWork NewUnitOfWork() 
{ 
   return new UnitOfWork(_context); 
} 

通过构造函数注入上下文:

public UnitOfWorkManager(IFFDbContext context) 
{ 
Database.SetInitializer<FFDbContext>(null); 
_context = context as FFDbContext; 
}

以下是我的两个绑定,但是每个接口都使用InRequestScope()将其实现绑定到它

  kernel.Bind<IPermissionService>().To<PermissionService>().InRequestScope();
       kernel.Bind<IUnitOfWorkManager>().To<UnitOfWorkManager>().InRequestScope();
       kernel.Bind<IFFDbContext>().To<FFDbContext>().InRequestScope();
       kernel.Bind<IRepositoryBase<PermissionEntity>>().To<RepositoryBase<PermissionEntity>>().InRequestScope();
kernel.Bind<ICommonRepository>().To<CommonRepository>().InRequestScope();


public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity :class 
{ 
private readonly DbSet<TEntity> _currentEntity; 
private readonly FFDbContext _context; 
public RepositoryBase(IFFDbContext dbContext) 
{ 
_context = dbContext as FFDbContext; 
if (_context != null) _currentEntity = _context.Set<TEntity>(); 
}

我不确定CommonRepository的代码是否可能成为问题....但是我再次注入dbcontext ..

  public class CommonRepository : ICommonRepository
    {
        private readonly IFFDbContext _commonDbContext;

        public FFDbContext CommonDbContext
        {
            get { return _commonDbContext as FFDbContext; }
        }

        public CommonRepository(IFFDbContext dbContext)
        {
            _commonDbContext = dbContext;
        }
    }

 public interface ICommonRepository
    {
        FFDbContext CommonDbContext { get; }
    }

0 个答案:

没有答案