Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity.MVC4 Doesn't Dispose()

I've installed the NuGet Unity.MVC4 package http://nuget.org/packages/Unity.Mvc4/ and have hooked it up the same as I would if I were using the Unity.MVC3 package.

My dependencies are getting resolved correctly, but when using the HierarchicalLifetimeManager, my object's Dispose() method is not called at the end of the request.

I've actually set up a simple project using Unity.MVC3 and Unity.MVC4, with the exact same Bootstrapper.cs code in both projects. On the MVC3 version, Dispose() is called; on the MVC4 version, it is not.

I'm registering my type like so

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

with a very simple Test class

    public interface ITest
{
    void Foo();
}

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

    }

    public void Foo()
    {

    }

    public void Dispose()
    {

    }
}

I don't think I'm doing anything incorrectly, but there appears to be some bug in the Unity.MVC4 package.

If anyone is successfully using that package, I'm curious how you got it to work.

like image 672
Mr. T Avatar asked Sep 17 '26 01:09

Mr. T


2 Answers

The best solution to this issue is to upgrade to Unity3 and install the Unity Bootstrapper for ASP.NET MVC package. The Bootstrapper package includes PerRequestLifetimeManager which should be used in place of HierarchicalLifetimeManager. Once the integration is complete, Dispose() is called at the end of every HTTP request just as expected.

Note that the newest Unity documentation suggests that PerRequestLifetimeManager should not be used at all unless absolutely necessary. (I believe, however, that it is still needed in some cases - for example, where you want to share a DbContext across all objects used during a single request.)

With this solution, Unity.MVC4 is no longer needed and can be uninstalled.

like image 112
Mr. T Avatar answered Sep 19 '26 22:09

Mr. T


I have had a look at the code. We simply ported the Unity.MVC3 code from codeplex (http://unitymvc3.codeplex.com/) and re-bundled it up for MVC4. We have not made any alterations to the code.

Unity.MVC4 makes use of the Unity package managed by Microsoft (http://nuget.org/packages/Unity/). The majority of the code is in Unity.

Are you running different Dot.Net versions? i.e 4.0 vs 4.5? There seems to be a pre-release Unity for DotNet 4.5.

like image 43
Oliver Avatar answered Sep 19 '26 22:09

Oliver