1

我有一个带有自我跟踪实体的大型 n 层 Web 项目。我正在使用 Entity Framework 5 并将对象上下文存储在其中HttpContext.Current.Items并对其进行处理,如此Application_EndRequest所述。我有一个单独的框架类库项目(CMS.Framework),其中包含所有(自我跟踪)POCO 类和更多逻辑。实际的 ASP.NET Web 窗体应用程序是指我的 CMS.Framework 项目。到目前为止,一切正常。

现在,我想创建一个控制台应用程序(用于计划的服务器任务)并使用我的 CMS.Framework 类库。但是,当自跟踪实体尝试初始化(并调用静态CoreContext属性)时,System.NullReferenceException会抛出 a,因为HttpContext.Current它是 null。这对我来说很有意义,因为我们现在在控制台应用程序中。这是我只在控制台应用程序中中断的代码:

    /// <summary>
    /// Gets the CmsCoreContext in order to access the CMS_Core DB. This context
    /// will be disposed when the application onloads (EndRequest).
    /// </summary>
    protected static CmsCoreContext CoreContext
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("CoreContext"))
            {
                // Set Entity Framework context here and reuse it throughout the application
                HttpContext.Current.Items.Add("CoreContext", new CmsCoreContext());
            }
            return HttpContext.Current.Items["CoreContext"] as CmsCoreContext;
        }
    }

new CmsCoreContext()当 HttpContext.Current 为空时,我应该在哪里存储?我可以使用任何控制台应用程序上下文吗?对此有什么建议吗?

4

1 回答 1

2

大概您在控制台应用程序的整个生命周期中只需要对象上下文的单个实例?像这样的东西应该工作:

private static CmsCoreContext _coreContext;

protected static CmsCoreContext CoreContext
{
   get
   {
      if (!System.Web.Hosting.HostingEnvironment.IsHosted)
      {
         return _coreContext ?? (_coreContext = new CmsCoreContext());
      }

      var context = HttpContext.Current;
      if (context == null) throw new InvalidOperationException();

      if (!context.Items.Contains("CoreContext"))
      {
         context.Items.Add("CoreContext", new CmsCoreContext());
      }

      return (CmsCoreContext)context.Items["CoreContext"];
   }
}

// The Application_EndRequest event won't fire in a console application.
public static void ConsoleCleanup()
{
   if (_coreContext != null)
   {
      _coreContext.Dispose();
   }
}
于 2013-06-03T17:47:26.250 回答