1

我在控制台应用程序中使用 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。或将来的其他工具。

4

1 回答 1

0

默认情况下,该RegisterType方法使用TransientLifetimeManagerwhich 不存储对创建对象的引用,因此它不会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**
}
于 2013-03-31T13:49:16.413 回答