Соединение объекта с несколькими потоками с использованием внедрения зависимости - PullRequest
0 голосов
/ 13 февраля 2019

Я пытался добавить параллельный foreach в существующее приложение и столкнулся со странной проблемой

Архитектура приложения

  1. Разрешение контроллера Уровень BO
  2. Служба разрешения уровня BOУровень
  3. Уровень обслуживания разрешает UOW и уровень хранилища
  4. Уровень UOW разрешает соединение с БД

Уровень BO

private IUserService _userService; 
public BOUser(IUserService userService) => _userService=userService; 

public void AddUser(User user) => _userService.addUser(user);

Уровень обслуживания

private IUnitofWork _uow;
private IUserRepository _userRepo;
UserService(IUOW _uow, IUserRepository _userRepo)
{
    uow = _uow;
    _userRepo.uow = _uow;
}

public void AddUser (User user) {
    _uow.BeginTransaction();
    _userRepo.Add(user);
    _uow.CommitTransaction();
}

Уровень репо

public IUnitOfWork UnitOfWork { get; set; }
public void Add(user){
    UnitOfWork.Connection.Insert<UserContact>(userContact, UnitOfWork.Transaction);
}

Единица работы

public UnitOfWork(IDbConnection connection)
{
    Connection = connection; // responsible for creating new connection
}

На сегодня это работает нормально, но поскольку я попытался добавить нескольких пользователей, используя параллельный. Foreach на уровне BO, у меня произошел один сбой и один успех

Причина в том, что сервисный уровень инициируется, когда инициируется уровень BO и UOW.connection остается равным 1 для всего процесса, когда я пробовал несколько потоков, потому что Соединение было одним объектом, который был разделен между несколькими потоками, но не удалось, потому что один поток завершил работу и закрыл объект Соединения

У меня есть решение в мind, удалив UOW из Конструктора и используя шаблон расположения службы, который будет

IUserSrevice userService = new UserService();

, который создаст несколько объектов подключения на основе потоков.

это не обрядный способ сделать это.Любое экспертное мнение поможет

1 Ответ

0 голосов
/ 13 февраля 2019

Connection не является потокобезопасным объектом, поскольку идея состоит в том, чтобы создать пул объектов соединений и каждый поток заимствует соединение из пула, выполняет свою работу и по окончании возвращает его в пул.

Таким образом, не более одного потока могут одновременно получить доступ к объекту соединения.

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

...