2011-01-31 64 views
4

我有一个IIS托管的WCF服务,具有单一调用行为。 我使用Fluent NH进行数据访问,并遇到以下问题。 我不能关闭/配置方法体内的NH会话,因为当序列化进入游戏时,它不能访问延迟加载的字段。 我试图使用NHibernate session management in WCF application这个问题的答案中描述的方法,但是在串行化开始之前,它也会发生会话处理。在WCF序列化返回对象后关闭NHibernate会话

你知道我是否可以在序列化完成后在实例上下文中执行任何代码?

感谢

回答

2

所以我找到了一个妥协的解决方案。 我仍然使用上面链接中的IDispatchMessageInspector实现,但我以不同的方式执行扩展分离。

下面是从最初的实现

 public void BeforeSendReply(ref Message reply, object correlationState) 
     { 
      var extensions = OperationContext.Current.InstanceContext.Extensions.FindAll<UnitOfWorkContextExtension>(); 

      foreach (var extension in extensions) 
      { 
       OperationContext.Current.InstanceContext.Extensions.Remove(extension); 
      } 
     } 

一个片段,我离开BeforeSendReply消息空(之前序列化,因为它发生),而是里面AfterReceiveRequest我suscribe到instanceContext.Closing和分离的事件处理程序

扩展
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
     { 
      instanceContext.Extensions.Add(new UnitOfWorkContextExtension(ServiceLocator.IoC.Retrieve<IUnitOfWorkFactory>().Create())); 
      instanceContext.Closing += DetachExtension; 

      return null; 
     } 
+0

你先生,太棒了。在我发现这个答案之前的一整天,我一直在努力解决同一个问题。 +1! – dvdvorle 2012-02-09 16:53:17

0

我也有兴趣在适当解决方案。

由于NHibernate类型会导致WCF序列化问题(即使是加载对象),我递归地遍历对象图并用反射帮助将所有代理替换为真实对象和基本.NET集合。这样WCF方法返回的所有对象都是普通的DTO,没有对NHibernate的引用。

我这样做明确内的WCF方法:

public Document GetDocumentById(int id) 
{ 
    using (var repository = GetRepository()) //Open ISession 
    { 
     var document = repository.GetDocumentById(id); 
     repository.DisconnectObject(document); //Replace proxies 
     return document; //Clean object 
    } //ISession.Dispose 
}