Ninject IntransientScope无法与DBContext一起使用?

时间:2019-01-24 15:07:04

标签: c# entity-framework scope ninject dispose

使用EntityFramework和Ninject,每次对存储库的调用完成时,我都需要处理上下文。我需要这样做,因此每次都会对数据库进行新的调用,而不是使用EF上下文范围。

这是我的测试库:

public class VehicleRepositoryTest : IVehicleRepository
{
    private DBEntities _context;

    public VehicleRepositoryTest(DBEntities context)
    {
        _context = context;
    }
    ....
    public List<TB_VEHICULO> GetAll()
    {
        return _context.TB_VEHICULO.ToList();
    }

这是我实现ninject模块的方式。我使用“ IntransientScope”的想法是在每次调用后都放置上下文:

Kernel.Bind<DBEntities>().ToSelf().InTransientScope();

Kernel.Bind<IVehicleRepository>().To<Test.VehicleRepositoryTest>().InTransientScope();

这个想法是,每次调用“ GetAll()”都会创建一个新的上下文,因此每次调用数据库时都会如此。

但是它不起作用。如果我打电话给“ GetAll()”,然后我得到数据A;然后我将数据库数据A更改为数据B,对“ GetAll()”进行新调用,我仍在获取数据A。

更多信息:

我的应用程序是WinForms应用程序,我使用合成模式来调用实例化注入的对象:

public static class CompositionRoot
{
    public static IKernel kernel { get; private set; }
    public static void WireModule(INinjectModule module)
    {
        kernel = new StandardKernel(module);
    }

    public static T Resolve<T>()
    {
        return kernel.Get<T>();
    }
}

对存储库的调用如下:

_vehicleRepository = CompositionRoot.Resolve<IVehicleRepository>();
var test = _vehicleRepository.GetAll();

1 个答案:

答案 0 :(得分:0)

我也遇到同样的问题。

我的旧代码:

kernel.Bind(typeof(IUnitOfWork)).To<UnitOfWork>().WithConstructorArgument("context", kernel.Get<MyContext>());

我的新代码:

kernel.Bind<DbContext>().To<MyContext>();
kernel.Bind(typeof(IUnitOfWork)).To<UnitOfWork>();

这项工作对我来说