2

我正在開發一個ASP.Net MVC 3 Web應用程序,它使用Unity 2.0作爲它的IoC容器。ASP.Net MVC 3 Unity IoC處置

下面顯示了我的的Application_Start的例子()方法在我的Global.asax文件

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    IUnityContainer container = new UnityContainer(); 

    container.RegisterType<IControllerActivator, CustomControllerActivator>(
     new HttpContextLifetimeManager<IControllerActivator>()); 

    //container.RegisterType<IUnitOfWork, UnitOfWork>(
    // new ContainerControlledLifetimeManager()); 
    container.RegisterType<IUnitOfWork, UnitOfWork>(
     new HttpContextLifetimeManager<IUnitOfWork>()); 

    container.RegisterType<IListService, ListService>(
     new HttpContextLifetimeManager<IListService>()); 
    container.RegisterType<IShiftService, ShiftService>(
     new HttpContextLifetimeManager<IShiftService>()); 

    DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
} 

HttpContextLifetimeManager看起來像這樣

public class HttpContextLifetimeManager<T> : LifetimeManager, IDisposable 
{ 
    public override object GetValue() 
    { 
     return HttpContext.Current.Items[typeof(T).AssemblyQualifiedName]; 
    } 

    public override void RemoveValue() 
    { 
     HttpContext.Current.Items.Remove(typeof(T).AssemblyQualifiedName); 
    } 

    public override void SetValue(object newValue) 
    { 
     HttpContext.Current.Items[typeof(T).AssemblyQualifiedName] = 
      newValue; 
    } 

    public void Dispose() 
    { 
     RemoveValue(); 
    } 
} 

我的問題是,方法Dispose()在上面的類中從來沒有調用過,當我把ab關注它。我擔心我的IoC容器實例從未被處置。這是否會導致問題?

我發現)這個代碼片斷,我放在我的的Global.asax文件,但仍的Dispose(方法不會被調用

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    using (DependencyResolver.Current as IDisposable); 
} 

誰能幫我該如何處置我的Unity容器的每個實例?

謝謝。

回答

2

Unity不追蹤它創建的實例,也不處理它​​們。 Rory Primrose有一個extension that does the tracking,允許通過呼叫container.TearDown()來處理物體。

LifetimeManagers自己清理完之後就是wishlist for Unity vNext

如果您在每個請求上執行此操作,則引導新的容器實例的開銷很大。所以我會考慮在完成所有註冊之後緩存容器實例。

3

使用Unity.MVC3 nuget包。然後,在初始化時指定HierarchicalLifetimeManager,並且在每次請求後您的對象將被丟棄。

 
container.RegisterType(new HierarchicalLifetimeManager()); 

就這麼簡單:)

+1

的'HierarchicalLifetimeManager'處置與壽命創建的對象,當容器它與設置註冊。如果您在每次請求時都這樣做,您將失去很多性能。 – 2012-07-26 20:46:38

+1

但我用它很好:)小孩的容器被丟棄。請參閱unity.mvc3軟件包詳細信息:允許Microsoft Unity Unity IoC容器與ASP.NET MVC 3的簡單集成的庫。此項目包含一個定製的DependencyResolver,它可以爲每個HTTP請求創建一個子容器,並在最後處理所有註冊的IDisposable實例的請求。 – 2012-07-27 15:33:29

+0

我之前看過這個項目。使用起來很簡單,而且完成這​​項工作。但我一般不喜歡子容器的概念(儘管這是個人觀點)。爲每個請求設置Unity的構建管道的性能退化取決於您在子容器中註冊的次數以及Web負載應用程序。 – 2012-07-27 17:20:51