C# 环境上下文作用域WCF实例提供程序
我打算在我的项目中使用环境上下文范围,这将在下面介绍。 我是一个客户端/服务器应用程序,客户端通过WCF服务连接。 现在的问题是如何实现WCF实例提供程序。 我尝试的方法总是在应该释放上下文时收到错误消息“System.InvalidOperationException:DbContextScope实例必须按照创建顺序进行释放!” 有人有办法解决这个问题吗 我的实例提供程序的代码被截断:C# 环境上下文作用域WCF实例提供程序,c#,wcf,C#,Wcf,我打算在我的项目中使用环境上下文范围,这将在下面介绍。 我是一个客户端/服务器应用程序,客户端通过WCF服务连接。 现在的问题是如何实现WCF实例提供程序。 我尝试的方法总是在应该释放上下文时收到错误消息“System.InvalidOperationException:DbContextScope实例必须按照创建顺序进行释放!” 有人有办法解决这个问题吗 我的实例提供程序的代码被截断: public class MyInstanceProvider<T> : IInstancePr
public class MyInstanceProvider<T> : IInstanceProvider, IContractBehavior where T : class
{
DbContextScopeFactory _dbContextScopeFactory;
Dictionary<int, IDbContextScope> _Contexts = new Dictionary<int, IDbContextScope>();
public MyInstanceProvider( DbContextScopeFactory dbContextScopeFactory )
{
_dbContextScopeFactory = dbContextScopeFactory;
}
public object GetInstance( InstanceContext instanceContext )
{
IDbContextScope contextScope = _dbContextScopeFactory.Create();
_Contexts[instanceContext.GetHashCode()] = contextScope;
var _Repository = new RepositoryFactory<T>().GetInstance();
return _Repository;
}
public object GetInstance( InstanceContext instanceContext, Message message )
{
return GetInstance( instanceContext );
}
public void ReleaseInstance( InstanceContext instanceContext, object instance )
{
var hashCode = instanceContext.GetHashCode();
if (_Contexts.ContainsKey( hashCode ))
{
var contextScope = _Contexts[hashCode];
contextScope.Dispose();
_Contexts.Clear();
}
}
公共类MyInstanceProvider:IInstanceProvider,IContractBehavior其中T:class
{
DbContextScopeFactory\u DbContextScopeFactory;
字典_Contexts=新字典();
公共MyInstanceProvider(DbContextScopeFactory DbContextScopeFactory)
{
_dbContextScopeFactory=dbContextScopeFactory;
}
公共对象GetInstance(InstanceContext InstanceContext)
{
IDbContextScope contextScope=_dbContextScopeFactory.Create();
_上下文[instanceContext.GetHashCode()]=contextScope;
var_Repository=new RepositoryFactory().GetInstance();
返回存储库;
}
公共对象GetInstance(InstanceContext InstanceContext,消息)
{
返回GetInstance(instanceContext);
}
public void ReleaseInstance(InstanceContext InstanceContext,对象实例)
{
var hashCode=instanceContext.GetHashCode();
if(_Contexts.ContainsKey(hashCode))
{
var contextScope=_Contexts[hashCode];
contextScope.Dispose();
_上下文。清除();
}
}
…您的代码中有三个潜在问题
instanceContext.GetHashCode()
作为字典键是不好的-哈希代码不能保证是唯一的。只需使用instanceContext
本身即可ReleaseInstance
方法中,检查字典是否有正确的键,处理contextScope
,然后清理整个字典(\u Contexts.Clear()
)。我认为应该将\u Contexts.Clear()
替换为\u Contexts.Remove>
字典
,而WCF可以在多个线程中执行您的代码。最好使用ConcurrentDictionary
1.尝试使用GetHashCode()获取引用上下文范围对象的唯一键。进行了一些测试,它似乎是唯一的。我的第一次尝试是以相同的结果存储上下文范围对象本身。2+3。您是对的,但这不是问题所在。然后,您遇到的是
DbContextScope
的详细信息。消息说您无法创建scope1和scope2,然后按相同的顺序处理它们:scope1和scope2。您使用的是知名的DbContextScope还是定制的?谢谢回答。希望找到熟悉“Mehdi Ambient ContextScope”的人这可以给我一个提示。环境作用域只是意味着它将自己放入当前的CallContext
。异常意味着你实际上拥有嵌套的上下文,即代码在当前的CallContext
中创建了一个新的DbScopeContext。你的WCF服务是如何设计的(回调、呼叫自身等)哪种可能导致呼叫相同的服务?