Unity Container возвращает синглтон вместо нового экземпляра - PullRequest
3 голосов
/ 16 июня 2019

Я пытаюсь понять, как работают Lifetime Managers.Я зарегистрировал 2 типа и впрыснул один в другой (Audi в Driver).Я создал два экземпляра Driver и, похоже, они используют один и тот же экземпляр Audi, когда я ожидал, что у каждого Driver будет свой экземпляр Audi (поскольку используется TransientLifetimeManager).

    public interface ICar
    {

        int Run();
    }

    public class Audi : ICar
    {            
        private int _miles = 0;

        public int Run()
        {
            return ++_miles;
        }
    }

    public class Driver
    {
        public ICar _car = null;       
        public Driver(ICar car)
        {
            _car = car;

        }

        public void RunCar()
        {
            Console.WriteLine("Running {0} - {1} mile ", _car.GetType().Name, _car.Run());
        }
    }



container.RegisterType<ICar, BMW>();
container.RegisterType<Driver>(new InjectionConstructor(container.Resolve<ICar>()));
var driver = container.Resolve<Driver>();
var driver2 = container.Resolve<Driver>();
//False, that's fine.
Console.WriteLine(ReferenceEquals(driver,driver2));
//True. Why??
Console.WriteLine(ReferenceEquals(driver._car,driver2._car));           

//The situation changes if I don't use InjectionConstructor parameter:
 container.RegisterType<Driver>();
//Now it returns False.
Console.WriteLine(ReferenceEquals(driver._car,driver2._car));

В чем разница?Почему использование InjectionConstructor меняет поведение?

1 Ответ

0 голосов
/ 16 июня 2019

Я наконец-то озадачился тем, что происходит. Спасибо haim770 за объяснение. В моем случае мне пришлось использовать ResolvedParameter<ICar> вместо container.Resolve<ICar>() внутри InjectionConstructor, чтобы добиться того, что я хотел. Разница между container.Resolve() и ResolvedParameter не очевидна, но этот вопрос проясняет это: В чем разница между IUnityContainer.Resolve () и ResolvedParameter при настройке аргументов конструктора?

...