1

我有 ASP.NET MVC 应用程序,我首先使用 EF 代码和 Unity 依赖注入器。我已经实现了 DDD 设计并拥有与我的 POCO 对象交互的存储库和服务。

我的问题是我遇到了与 EF 相关的问题 - 例如连接已关闭、实体已更改或未跟踪等等。正如我从谷歌的研究中了解到的那样,它与我应该配置 Unity 的方式有关。

我知道我需要根据请求实例放置它,但正如我所见,Unity 和 Unity.Mvc3 包中都没有内置策略。我尝试编写自己的策略,它解决了许多问题,但我确实遇到了有时我会“连接关闭”的问题。

我的 HttpContextLifetimeManager.cs

public class HttpContextLifetimeManager<T> : LifetimeManager, IDisposable
{
    public override object GetValue()
    {
        return HttpContext.Current.Items[typeof(T).AssemblyQualifiedName];
    }

    public override void RemoveValue()
    {
        HttpContext.Current.Items.Remove(typeof(T).AssemblyQualifiedName);
    }

    public override void SetValue(object newValue)
    {
        HttpContext.Current.Items[typeof(T).AssemblyQualifiedName] = newValue;
    }

    public void Dispose()
    {
        RemoveValue();
    }
}

在 DependencyConfig.cs (MVC 4 App_Start) 中,我使用以下方法注册它:

container.RegisterInstance<MyDbContext>(new MyDbContext(), new HttpContextLifetimeManager<DependencyConfig>());

你能推荐我一个有效的实现/帮助我修复我的/将我转发到可以帮助我解决这个问题的文章或教程吗?

非常感谢。

4

1 回答 1

1

App_Start方法仅在应用程序的第一个请求到来时调用一次。

    Called when the first resource (such as a page) in an ASP.NET application is requested.  
 The Application_Start method is called only one time during the life cycle of an application.  

MSDN

因此,您正在为所有请求创建一个上下文。然后有时它可能会被丢弃。为所有请求(内存问题等)保留一个 DbContext 并不是一个好习惯。
因此,您可以尝试将该代码放入Application_BeginRequest.

于 2013-01-25T03:49:53.840 回答