WCF服务内部的using语句

本文关键字:using 语句 内部 服务 WCF | 更新日期: 2023-09-27 18:28:11

我正在使用NHibernate连接到我的数据库并检索一些数据,如下所示:

public abstract class BaseContext<TContext> : IBaseContext<TContext> where TContext : IGuid
{
    #region Data Members
    // NHibernate session
    private readonly Lazy<ISession> _session;
    // Logger
    private static readonly ILog log = LogManager.GetLogger(typeof(BaseContext<TContext>));
    #endregion
    #region Ctor
    protected BaseContext()
    {
        // Initialize session 
        _session = new Lazy<ISession>(NHibernateHelper.OpenSession);
        // log
        log.Debug("Session has been created but has not yet been used.");
    }
    #endregion
    #region Propreties
    /// <summary>
    /// Lazy load a session with NHibernate
    /// </summary>
    public ISession Session
    {
        get { return _session.Value; }
    }
    #endregion
    #region Methods
    /// <summary>
    /// Retreives all object of type <see cref="TContext"/> from the database.
    /// </summary>
    /// <returns>A list of all the <see cref="TContext"/> items</returns>
    public IEnumerable<TContext> Get()
    {
        try
        {
            log.DebugFormat("Retrieving all items of type {0} from the database.",
                    typeof(TContext).Name);
            // Return all the items of TContext type
            return from item in Session.Query<TContext>()
                   select item;
        }
        catch (Exception ex)
        {
            log.Error("Could not retreive items from the database.", ex);
            return default(IEnumerable<TContext>); 
        }
    }
    /// <summary>
    /// Disposes the context
    /// </summary>
    public void Dispose()
    {
        // Dispose session
        Session.Dispose();
    }
    #endregion
}

我有一个包装器类,代表我想要检索的每个实体,例如:

public class EntityContext : BaseContext<DataEntity>
{
    #region Methods
    /// <summary>
    /// Gets a list of all enitities
    /// </summary>
    /// <returns>A list of all entities</returns>
    public new IEnumerable<DataEntity> Get()
    {
        return base.Get();
    }
    #endregion
}

为了公开这一点,我创建了一个使用它的WCF服务:

    public List<DataEntity> Get()
    {
        using (EntityContext context = new EntityContext())
        {
            var entities = context.Get();
            return entities.ToList();
        }
    }

当我使用WCF服务时,我一直收到"连接中止"异常,直到我找到原因。当我删除using语句(对Dispose方法的调用)时,它可以正常工作。

我的问题是为什么?我应该如何正确地实现这一点?

谢谢,Omri

WCF服务内部的using语句

您需要的是会话生存期,它将与WCF服务的请求相关。这就是你应该在谷歌上搜索的。

以下是一些链接,如何:

  • WCF应用程序中的NHibernate会话管理
  • NHibernate+WCF+Windows服务和WcfOperationSessionContext类

请求持续会话:

  • 2.3.上下文会话-NHibernate文档:NHibernate.Context.WcfOperationSessionContext

  • 带有WcfOperationSessionContext的NHibernate SessionPerRequest-示例