SingleInstance () является потокобезопасным в оконном приложении - PullRequest
0 голосов
/ 28 января 2019

У меня есть приложение для Windows, в котором я внедряю внедрение зависимостей от Autofac.У меня есть класс DBContext, который взаимодействует с БД для работы с SQL.Я использую EntityFramework.У меня есть сценарий, что мне нужно выбрать объекты отдельно с данными из базы данных на основе некоторого первичного ключа из разных таблиц.Затем после некоторой бизнес-логики мне снова нужно обновить эти объекты в БД.Но здесь либо все выбранные сущности БД должны быть обновлены, либо нет.поэтому я придерживаюсь схемы работы для этого.Но при извлечении сущностей db из хранилища с использованием того же экземпляра dbContext он терял другие сущности из dbContext.Я использовал AsImplementedInterfaces () (из autofac) для разрешения моего экземпляра DbContext, который не работает в моем сценарии.Я изменил его SingleInstance (), тогда я смогу выполнить мое требование.Здесь я сомневаюсь, является ли SingleInstance () поточно-ориентированным для приложений Windows или для вышеописанного типа работы?

builder.Register(c => new PortalDbContext(connectionString)).As<IPortalDbContext>().AsImplementedInterfaces();    

TO

builder.Register(c => new PortalDbContext(connectionString)).As<IPortalDbContext>().SingleInstance();    

У меня есть три класса репозитория и один бизнесlayer (BL), BL вызывает все классы хранилища один за другим для извлечения данных с одним и тем же экземпляром DBContext.Затем, в конце концов, он вызывает один метод DBContext.SaveChanges (), который должен сохранить данные всех сущностей за один раз, или никакие данные не должны обновляться в случае сбоя любого из них.Он работает с областью действия SingleInstance ().Но не уверен, является ли SingleInstance поточно-ориентированным или нет.

1 Ответ

0 голосов
/ 28 января 2019

Согласно autfac, разрешение службы является поточно-ориентированным документация :

Все операции с контейнерами безопасны для использования между несколькими потоками.

Единственное, что нужно иметь в виду, это то, что объекты контекста разрешения являются однопоточными, поэтому вам нужно избегать регистрации компонента как:

builder.Register(c => new MyComponent(c)); //DON'T DO!

, но как:

builder.Register(c =>
{
  IContext threadSpecificContext = c.Resolve<IComponentContext>(); // access real context.
  return new MyComponent(threadSpecificContext);
}

(см., Что threadSpecificContext был разрешен, и контекст "c" не использовался)

В вашем случае вы не использовали "c "контекст вообще, см. Также ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...