3

は、私は複数のリポジトリのための1 Dbcontextを持っている私のDbConntextObjDbContext UnityがHttpContextLifetimeManager.RemoveValue()を呼び出しません。

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

Unityがlifetimemanager

でたremoveValue()を呼び出していない定義しています。

私lifetimemanagerは、次のようになります。

DbContextのDisposeが呼び出されていないことを
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(); 
     } 
    } 

それは悪いことですか? 回避策はありますか?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(); 
    } 
} 
関連する問題