我有使用自定义UsernamePasswordValidator的WCF服务。验证者需要访问我的实体框架上下文。
我想为整个服务调用创建一个ObjectContext,然后在调用结束时销毁/处理它。因此,我创建了一个提供此功能的单例静态类,但是,现在发生的是,如果同时发生两个服务调用,则其中一个调用将处理单例。
我要么保留对ObjectContext的本地引用,在这种情况下,要使用它的第二个服务将其视为已处置并引发错误,或者在需要的地方将包装器属性放在Singleton类周围,然后将所有更改都引发离开,因为如果另一个调用处理了该对象,我将获得该对象的新实例。
因此,基本上我的问题是如何为每个服务调用实例化ObjectContext?
注意:该实例在服务代码和自定义UsernamePasswordValidator代码中都必须是可访问的。
我不能只在构造函数中使用它,也不能使用using语句,因为这样自定义UsernamePasswordValidator无法访问它。有没有办法让每个调用都有一个静态类?听起来确实不可能,但是如何解决呢?我应该在会话中缓存对象吗?
我的服务托管在IIS中。
更新:
因此,我已将其确定为使用IExtension对象将状态存储在InstanceContext中。但是,如何在UsernamePasswordValidator中访问当前的InstanceContext?
最佳答案
好的,所以最后我使用以下静态类并依靠ASP.NET为我缓存了上下文,从而解决了该问题。
我不确定这是否是最好的处理方式,但这使我可以在每个请求中使用一个ObjectContext,这样我就不必花太多时间了,这也意味着我不必在对象上使用锁如果许多用户正在使用该服务,这将成为一场噩梦。
public static class MyContextProvider
{
public static MyModel Context
{
get
{
if (HttpContext.Current.Items["context"].IsNull())
{
HttpContext.Current.Items["context"] = new MyModel();
}
return HttpContext.Current.Items["context"] as MyModel;
}
}
}
然后,只要我需要在应用程序中需要ObjectContext的任何地方
var context = MyContextProvider.Context;