簡體   English   中英

控制台應用程序C#中的Unity 2 IDisposable問題

[英]Unity 2 IDisposable Issue in Console Application C#

我在控制台應用程序中使用Unity 2.1.505.0,該應用程序由一個IDisposable實現CarRepository 但是,不在其范圍內時永遠不會調用Dispose() 下面是代碼示例:

    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。 或其他將來的工具。

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

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

您可以在此處閱讀有關生命周期管理器的信息: 了解生命周期管理器

如果您的目標是在使用后處置CarRepository ,則可以使用HierarchicalLifetimeManager子容器來實現它:

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**
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM