我正在使用可以访问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; }
}