3

我已经安装了 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 包中似乎存在一些错误。

如果有人成功使用了那个包,我很好奇你是怎么让它工作的。

4

2 回答 2

3

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

请注意,最新的 Unity 文档建议PerRequestLifetimeManager除非绝对必要,否则根本不应该使用它。(但是,我相信在某些情况下仍然需要它 - 例如,您希望DbContext在单个请求期间使用的所有对象之间共享它。)

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

于 2013-06-26T15:35:52.050 回答
1

我看过代码。我们简单地从 codeplex ( http://unitymvc3.codeplex.com/ )移植 Unity.MVC3 代码并将其重新捆绑到 MVC4 中。我们没有对代码进行任何更改。

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

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

于 2013-04-19T06:43:59.763 回答