首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UnitOfWork与多个同时连接的斗争

UnitOfWork与多个同时连接的斗争
EN

Stack Overflow用户
提问于 2015-10-22 10:04:39
回答 1查看 1K关注 0票数 3

显然(而且很可能)我的当前UnitOfWork实现中存在一个缺陷,因为我在一次执行许多调用时出现了连接错误。

异常:

基础提供程序在打开时失败。

内部异常:

连接没有关闭。连接的当前状态是连接。 这会在客户端产生HTTP 500响应。

UnitOfWork实现

代码语言:javascript
运行
复制
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注入的,因此我认为它实际上是一个单例。

问题

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

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

免责声明

我不认为我完全理解UoW,所以我的实现可能需要改进,温和一点:)。在这方面的任何改进都是值得欢迎的!

更新

我知道- EF上下文是一个UoW,我在域级别使用我的上下文来支持与功能相关的数据的事务处理。这也是由于客户的需求,我别无选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-22 12:38:33

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

但是,我认为您滥用了UoW应该做什么的概念。UoW用于为一组事务提供容器。例如,假设您有一个eCommerce平台。创建订单时,您将在orders表中插入一行,然后作为同一事务的一部分,您还将将行插入订单项表,更新用户忠诚点等。因此,您应该在单个工作单元内完成所有这些操作,提交,然后销毁它。让IoC框架(在本例中是团结)为每个会话创建您的工作单元。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33278413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档