3

我定义我的DbConntextObjDbContext Unity不会调用HttpContextLifetimeManager.RemoveValue()坏事?

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

团结未在lifetimemanager

调用RemoveValue()我有一个的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处置不会被调用? 对于Unity和MVC3有没有解决方法?

回答

0

试试这个。

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(); 
    } 
} 
相关问题