c# - UnitOfWork 与多个同时连接作斗争

标签 c# .net asp.net-mvc

显然(而且很有可能)我当前的 UnitOfWork 实现存在缺陷,因为我在同时进行多个调用时出现连接错误。

异常:

The underlying provider failed on Open.

内部异常:

The connection was not closed. The connection's current state is connecting.

This results in a HTTP 500 response on the client side.

UnitOfWork 实现

public class ScopedUnitOfWork : IUnitOfWork
{
    public Entities Context { get; set; }
    public UnitOfWorkState State { get; set; }

    public ScopedUnitOfWork(IEnvironmentInformationProvider environmentInformationProvider)
    {
        this.Context = new Entities(environmentInformationProvider.ConnectionString);
        this.State = UnitOfWorkState.Initialized;
    }

    public UowScope GetScope()
    {
        this.State = UnitOfWorkState.Working;

        return new UowScope(this);
    }

    public SaveResult Save()
    {
        if (this.State != UnitOfWorkState.Working)
            throw new InvalidOperationException("Not allowed to save out of Scope. Request an UowScope instance by calling method GetScope().");

        this.Context.SaveChanges();

        this.State = UnitOfWorkState.Finished;

        return new SaveResult(ResultCodes.Ok);
    }
}

处理单个 UowScope 可以解决问题,但在当前情况下这是不可能的,因为每个请求都是完全独立的。事实上每个请求都在使用 UoWScope,但显然当 UoW 一次收到许多调用时它会出错。

UoW 是通过 Unity IoC 注入(inject)的,所以我认为它实际上是一个单例。

问题

有没有办法调整 UoW,使单独的高频请求不成问题?

我最好解决这个服务器端,而不是客户端,有什么提示吗?谢谢!

免责声明

我并没有声称我完全理解 UoW,所以我的实现可能需要改进,请保持温和 :)。欢迎对此进行任何改进!

更新

我知道 EF 上下文是一个 UoW,我在域级别使用我的来启用与功能相关的数据的事务处理。而且也是客户需求,我也没办法。

最佳答案

您遇到的问题是工作对象单元实际上是一个单例,因为您的 IoC 框架在您的应用程序期间一直保持它。这意味着您的上下文被保存为单例,因为它在 UoW 中。因此,您几乎肯定会收到多个并发 调用您的上下文,这将引发异常。

但是,我认为您误用了 UoW 应该做什么的概念。 UoW 用于为一组事务提供容器。例如,假设您有一个电子商务平台。当您创建订单时,您将在订单表中插入一行,然后作为同一事务的一部分,您还将在订单项目表中插入行,更新用户忠诚度积分等。所以您应该在一个单一的工作单元,提交它,然后销毁它。让 IoC 框架(在本例中为 Unity)为每个 session 创建您的工作单元。

关于c# - UnitOfWork 与多个同时连接作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33278413/

相关文章:

c# - WPF C# : MVVM - Passing on the Sudoku from ViewModel -> View

.net - 如何编写能够验证 URI 的正则表达式模式?

asp.net-mvc - 尝试确定在全新安装的 Windows 10 + vs2015 上托管您的应用程序的 DNX 进程的进程 ID 时发生错误

asp.net - 一切就绪,但验证不起作用

c# - 非托管代码中的内存泄漏?

c# - 有谁知道我在哪里可以找到通用 Windows 专用网络(客户端和服务器)代码示例?

c# - 将字符串从 C 函数传递给 C#

.net - 在VS中快速创建依赖项属性

.net - BinaryFormatter 替代方案

c# - MVC Entity Framework 在 View 中使用嵌套的 foreach