Я пытался добавить параллельный foreach в существующее приложение и столкнулся со странной проблемой
Архитектура приложения
- Разрешение контроллера Уровень BO
- Служба разрешения уровня BOУровень
- Уровень обслуживания разрешает UOW и уровень хранилища
- Уровень 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();
, который создаст несколько объектов подключения на основе потоков.
это не обрядный способ сделать это.Любое экспертное мнение поможет