Ninject IntransientScope не работает с DBContext? - PullRequest
0 голосов
/ 24 января 2019

Работа с 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.

Дополнительная информация:

Myприложение является приложением 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 голосов
/ 19 марта 2019

У меня была такая же проблема.

Мой старый код:

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

Мой новый код:

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

Эта работа для меня.

...