3

我使用 UnitOfWork 模式和实体框架来使用下面的代码公开 DbContext。所以我的问题是,用 Ninject 获取 Context 实例是否可行?

工作单位

public interface IUnitOfWork<C> :  IDisposable
{
        int Commit();
        C GetContext { get; set; }
}

工作单位

public class UnitOfWork<C> : IUnitOfWork<C> where C : DbContext
    {
        private bool _disposed;
        private readonly C _dbContext = null;

        public UnitOfWork()
        {
            GetContext = _dbContext ?? Activator.CreateInstance<C>();
        }

        public int Commit()
        {
            return GetContext.SaveChanges();
        }


        public C GetContext
        {
            get;
            set;
        }
[...]

现在在NinjectWebCommon

private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<IUnitOfWork<MyDbContext>>().To<UnitOfWork<MyDbContext>>().InRequestScope();
  kernel.Bind<IEmployeeRepository>().To<EmployeeRepository>();
}

如果不使用_dbContext ?? Activator.CreateInstance<C>();,是否可以通过Ninject获取DbContext实例?

4

1 回答 1

3

是的,有可能 。检查下面的解决方案

Ninject DI 配置

kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
kernel.Bind<IUnitOfWork<MyDbContext>>().To<UnitOfWork<MyDbContext>>();
kernel.Bind<IEmployeeRepository>().To<EmployeeRepository>();

UnitOfWork中

   public class UnitOfWork<C> : IUnitOfWork<C> where C : DbContext
    {
        private readonly C _dbcontext;

        public UnitOfWork(C dbcontext)
        {
            _dbcontext = dbcontext;
        }

        public int Commit()
        {
           return _dbcontext.SaveChanges();
        }

        public C GetContext
        {
            get
            {
                return _dbcontext;
            }

        }
[...]
于 2013-01-14T20:03:51.167 回答