2013-03-31 55 views
1

我在控制檯應用程序中使用Unity 2.1.505.0,它由IDisposable實現CarRepository組成。然而,Dispose()不在其範圍之外。以下是代碼示例:統一2控制檯應用程序中的IDisposable問題C#

internal class Program 
    { 
     private static void Main(string[] args) 
     {   
      CarShop.Entry(); 
     } 
    } 

    class CarShop 
    { 
     static UnityContainer unityContainer = new UnityContainer(); 

     public static void Entry() 
     {   
      unityContainer.RegisterType<ICarRepository, CarRepository>(); 
      var carShop = new CarShop(); 
      carShop.BuyCar(); 
     } 

     public void BuyCar() 
     { 
      CheckCar(); 
     } 

     private void CheckCar() 
     { 
      var carService = unityContainer.Resolve<CarService>(); 
      var car = carService.GetCar(1); 
     // **Dispose() method is not called out of this scope** 
     } 
    } 

    class CarService 
    { 
     private ICarRepository carRepository; 
     public CarService(ICarRepository carRepository) 
     { 
      this.carRepository = carRepository; 
     } 

     public Car GetCar(int id) 
     { 
      return this.carRepository.GetCar(id); 
     } 
    } 

    interface ICarRepository 
    { 
     Car GetCar(int id); 
    } 

    class CarRepository : ICarRepository, IDisposable 
    { 
     public Car GetCar(int id) 
     { 
      return null; 
     } 

     public void Dispose() 
     { 

     } 
    } 

    public class Car 
    { 
    } 

任何想法?

更新

由於@nemesv提出以下解決方案:

unityContainer.RegisterType<ICarRepository, CarRepository>(
     new HierarchicalLifetimeManager()) 

using (var childContainer = unityContainer.CreateChildContainer()) 
    { 
     var carService = childContainer.Resolve<CarService>(); 
     var car = carService.GetCar(1);    
    } 

它的工作原理。但與Unity.MVC不同,它需要明確創建childContainer。是否有透明的方式處理IDispose對象,如Unity.MVC。或未來的其他工具。

+0

處置是NEVER自動調用,它與Unity無關。 –

+0

Unity.MVC可以解決這個問題。所以我認爲它會用於控制檯應用程序。 – Pingpong

回答

0

默認情況下,RegisterType方法使用TransientLifetimeManager,它不存儲對已創建對象的引用,因此它不會爲您調用Dispose

在構建的LifetimeManager實現中,只有ContainerControlledLifetimeManager在處理容器本身時處置託管對象。

您可以閱讀有關終身經理的位置:Understanding Lifetime Managers

如果你的目標是使用後處置CarRepository,那麼你可以使用HierarchicalLifetimeManagerchild containers實現它:

public static void Entry() 
{   
    unityContainer.RegisterType<ICarRepository, CarRepository>(
     new HierarchicalLifetimeManager()); 
    var carShop = new CarShop(); 
    carShop.BuyCar(); 
} 

private void CheckCar() 
{ 
    using (var childContainer = unityContainer.CreateChildContainer()) 
    { 
     var carService = childContainer.Resolve<CarService>(); 
     var car = carService.GetCar(1);    
    } 
    // **Dispose() method is not called out of this scope** 
} 
+0

ContainerControlledLifetimeManager不起作用。我錯過了別的嗎? – Pingpong

+0

「ContainerControlledLifetimeManager無法正常工作」是什麼意思? – nemesv

+0

「ContainerControlledLifetimeManager不工作」我的意思是不調用dispose()。 – Pingpong