使用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();
答案 0 :(得分:0)
我也遇到同样的问题。
我的旧代码:
kernel.Bind(typeof(IUnitOfWork)).To<UnitOfWork>().WithConstructorArgument("context", kernel.Get<MyContext>());
我的新代码:
kernel.Bind<DbContext>().To<MyContext>();
kernel.Bind(typeof(IUnitOfWork)).To<UnitOfWork>();
这项工作对我来说