显然(而且很可能)我的当前UnitOfWork实现中存在一个缺陷,因为我在一次执行许多调用时出现了连接错误。
异常:
基础提供程序在打开时失败。
内部异常:
连接没有关闭。连接的当前状态是连接。 这会在客户端产生HTTP 500响应。
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注入的,因此我认为它实际上是一个单例。
问题
是否有办法调整UoW,使单独的高频请求不成问题?
最好我能解决这个服务器端,而不是客户端,有什么建议吗?谢谢!
免责声明
我不认为我完全理解UoW,所以我的实现可能需要改进,温和一点:)。在这方面的任何改进都是值得欢迎的!
更新
我知道- EF上下文是一个UoW,我在域级别使用我的上下文来支持与功能相关的数据的事务处理。这也是由于客户的需求,我别无选择。
发布于 2015-10-22 12:38:33
您所遇到的问题是,工作单元对象实际上是一个单例,因为您的IoC框架在您的应用程序期间一直保持它的存在。这意味着您的上下文也被保持为单例,因为它位于UoW中。因此,您几乎肯定会得到对上下文的多个并发调用,这将引发异常。
但是,我认为您滥用了UoW应该做什么的概念。UoW用于为一组事务提供容器。例如,假设您有一个eCommerce平台。创建订单时,您将在orders表中插入一行,然后作为同一事务的一部分,您还将将行插入订单项表,更新用户忠诚点等。因此,您应该在单个工作单元内完成所有这些操作,提交,然后销毁它。让IoC框架(在本例中是团结)为每个会话创建您的工作单元。
https://stackoverflow.com/questions/33278413
复制相似问题