使用依赖注入的具有多个线程的连接对象

时间:2019-02-13 11:12:53

标签: multithreading dependency-injection unit-of-work

我一直在尝试在现有应用程序中添加并行的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
}

到今天为止,这个方法还不错,但是当我尝试在BO层中使用parallel.foreach添加多个用户时,我遇到了一次失败,一次成功

当BO层启动且UOW.connection在整个过程中保持为1时,将启动服务层 当我尝试多个线程时,因为连接是多个线程之间共享的一个对象 它失败,因为一个线程完成了工作并关闭了Connection对象

我想出了解决方案,方法是从构造函数中删除UOW并使用将是

的服务位置模式
IUserSrevice userService = new UserService();

将基于线程创建多个连接对象。

它不是礼仪的方式。任何专家的意见都会有所帮助

1 个答案:

答案 0 :(得分:0)

cur_node.next=new_node不是线程安全的对象,因为其想法是创建一个连接对象池,并让每个线程从该池借用连接,完成其工作,并在完成后将其返回到池中。

>

一次最多只能有一个线程访问一个连接对象。

您应该注入连接池而不是单个连接对象。