Unity.MVC4不Dispose()

时间:2013-04-18 17:07:00

标签: asp.net-mvc-4 unity-container

我已经安装了NuGet Unity.MVC4软件包http://nuget.org/packages/Unity.Mvc4/并且已经像我使用Unity.MVC3软件包一样连接它。

我的依赖项正在得到正确解析,但在使用HierarchicalLifetimeManager时,我的对象的Dispose()方法在请求结束时不会被调用。

我实际上使用Unity.MVC3和Unity.MVC4建立了一个简单的项目,两个项目中的Bootstrapper.cs代码完全相同。在MVC3版本上,调用Dispose();在MVC4版本上,它不是。

我正在注册我的类型

            container.RegisterType<ITest, Test>(new HierarchicalLifetimeManager());

有一个非常简单的测试类

    public interface ITest
{
    void Foo();
}

public class Test : IDisposable, ITest
{
    public Test()
    {

    }

    public void Foo()
    {

    }

    public void Dispose()
    {

    }
}

我不认为我做错了什么,但Unity.MVC4包中似乎有一些错误。

如果有人成功使用该软件包,我很好奇你是如何使用它的。

2 个答案:

答案 0 :(得分:3)

此问题的最佳解决方案是升级到Unity3并安装Unity Bootstrapper for ASP.NET MVC包。 Bootstrapper软件包包含PerRequestLifetimeManager,应该用HierarchicalLifetimeManager代替Dispose()。集成完成后,在每个HTTP请求结束时调用PerRequestLifetimeManager,就像预期的那样。

请注意,newest Unity documentation表示除非绝对必要,否则不应使用DbContext。 (但我相信,在某些情况下仍然需要它 - 例如,您希望在单个请求中使用的所有对象之间共享{{1}}。)

使用此解决方案,不再需要Unity.MVC4,可以将其卸载。

答案 1 :(得分:1)

我看了一下代码。我们只是从codeplex(http://unitymvc3.codeplex.com/)移植Unity.MVC3代码并将其重新捆绑为MVC4。 我们没有对代码进行任何更改。

Unity.MVC4使用Microsoft管理的Unity包(http://nuget.org/packages/Unity/)。大多数代码都在Unity中。

您运行的是不同的Dot.Net版本吗?即4.0 vs 4.5?似乎有一个预发布的Unity for DotNet 4.5。