使用实体框架代码优先使用ASP.NET和Unity Ioc

时间:2013-01-25 03:38:00

标签: asp.net-mvc entity-framework dependency-injection unity-container

我有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>());

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

非常感谢。

1 个答案:

答案 0 :(得分: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