1

IDisposable実装で構成されるコンソール アプリケーションで Unity 2.1.505.0 を使用しています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ます。IDisposeUnity.MVCのように、オブジェクトを破棄する透過的な方法はありますか。または将来の他のツール。

4

1 に答える 1

0

この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**
}
于 2013-03-31T13:49:16.413 に答える