【问题标题】:Close NHibernate session after WCF serialized return objectWCF 序列化返回对象后关闭 NHibernate 会话
【发布时间】:2011-06-18 12:18:04
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: .net wcf serialization


    【解决方案1】:

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

    这是一个来自原始实现的 sn-p

            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 内部我订阅了 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;
            }
    

    【讨论】:

    • 你先生,真棒。在找到这个答案之前,我整天都在为同一个问题苦苦挣扎。 +1!
    【解决方案2】:

    我也对合适的解决方案感兴趣。

    因为 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
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多