DbContext Unity не извиква HttpContextLifetimeManager.RemoveValue() Лошо нещо?

Дефинирам своя DbConntextObj

_container.RegisterType<IDbConntextObj, DbConntextObj>(new HttpContextLifetimeManager<DbConntextObj>());

Unity не извиква RemoveValue() на lifetimemanager

Имам един Dbcontext за множество хранилища.

Моят lifetimemanager изглежда така:

public class HttpContextLifetimeManager<T> : LifetimeManager, IDisposable
    {
        private readonly string _itemName = typeof(T).AssemblyQualifiedName;

        public override object GetValue()
        {
            return HttpContext.Current.Items[_itemName];
        }
        public override void RemoveValue()
        {
            var disposable = GetValue() as IDisposable;
            HttpContext.Current.Items.Remove(_itemName);

            if (disposable != null)
                disposable.Dispose();
        }

        public override void SetValue(object newValue)
        {
            HttpContext.Current.Items[_itemName] = newValue;
        }
        public void Dispose()
        {
            RemoveValue();
        }
    }

Лошо ли е, че DbContext Dispose не се извиква? Има ли заобиколно решение за Unity и MVC3?


person maxfridbe    schedule 08.03.2012    source източник


Отговори (1)


Опитайте тази.

    public class MvcApplication : HttpApplication
{
    private IUnityContainer unityContainer;
    private HttpContextDisposableLifetimeManager ContextLifeTimeManager;
    /// <summary>
    /// The start method of the application.
    /// </summary>
    protected void Application_Start()
    {
        unityContainer = new UnityContainer();
        ContextLifeTimeManager = new HttpContextDisposableLifetimeManager();
        //for some reason this event handler registration doesn't work, meaning we have to add code to
        //Application_EndRequest as below...
        //this.EndRequest += new EventHandler(ContextLifeTimeManager.DisposingHandler);
        unityContainer.RegisterType<IUnitOfWork, EFUnitOfWork>(ContextLifeTimeManager);
        unityContainer.RegisterType<IRepository<ShoppingCart>, ShoppingCartRepository>(new ContainerControlledLifetimeManager());
    }
    //this seems hackish, but it works, so whatever...
    protected void Application_EndRequest(Object sender, EventArgs e)
    {
        if (ContextLifeTimeManager != null)
        {
            ContextLifeTimeManager.RemoveValue();
        }
    }
}

След това във вашата реализация на LifeTimeManager.

public class HttpContextDisposableLifetimeManager : LifetimeManager, IDisposable
{        
    const string _itemName = typeof(T).AssemblyQualifiedName;

    public void DisposingHandler(object source, EventArgs e)
    {
        RemoveValue();
    }

    public override object GetValue()
    {
        return HttpContext.Current.Items[_itemName];
    }
    public override void RemoveValue()
    {
        Dispose();
        HttpContext.Current.Items.Remove(_itemName);
    }

    public override void SetValue(object newValue)
    {
        HttpContext.Current.Items[_itemName] = newValue;
    }
    public void Dispose()
    {
        var obj = (IDisposable)GetValue();
        obj.Dispose();
    }
}
person dean oliver    schedule 08.03.2012