C# Unity容器返回单例而不是新实例

C# Unity容器返回单例而不是新实例,c#,unity-container,C#,Unity Container,我试图弄清楚终身管理者是如何工作的。我登记了两种类型,并将一种注入另一种(奥迪注入驾驶员)。我创建了两个驱动程序实例,看起来它们使用的是同一个奥迪实例,而我希望每个驱动程序都有自己的奥迪实例(因为使用了TransientLifetimeManager) 公共接口ICar { int Run(); } 公共级奥迪:ICar { 私家车里程=0; 公共int运行() { 返回+++u英里; } } 公务舱司机 { 公共ICar_car=null; 公共司机(ICar汽车) {

我试图弄清楚终身管理者是如何工作的。我登记了两种类型,并将一种注入另一种(奥迪注入驾驶员)。我创建了两个驱动程序实例,看起来它们使用的是同一个奥迪实例,而我希望每个驱动程序都有自己的奥迪实例(因为使用了TransientLifetimeManager)

公共接口ICar
{
int Run();
}
公共级奥迪:ICar
{            
私家车里程=0;
公共int运行()
{
返回+++u英里;
}
}
公务舱司机
{
公共ICar_car=null;
公共司机(ICar汽车)
{
_汽车=汽车;
}
公共车辆
{
WriteLine(“Running{0}-{1}mile”,_car.GetType().Name,_car.Run());
}
}
container.RegisterType();
RegisterType(新的InjectionConstructor(container.Resolve());
var driver=container.Resolve();
var driver2=container.Resolve();
//错,没关系。
Console.WriteLine(ReferenceEquals(driver,driver2));
//对。为什么?
控制台写入线(参考等于(驾驶员、驾驶员2、驾驶员2);
//如果不使用InjectionConstructor参数,情况会发生变化:
container.RegisterType();
//现在它返回False。
控制台写入线(参考等于(驾驶员、驾驶员2、驾驶员2);

有什么区别?为什么InjectionConstructor的使用会改变行为?

我终于弄明白了到底发生了什么。谢谢haim770的解释。 在我的例子中,我必须在
InjectionConstructor
中使用
ResolvedParameter
而不是
container.Resolve()
,以实现我想要的。
container.Resolve()

因为当您使用
InjectionConstructor
时,您明确指示Unity使用传递给它的
ICar
实例。如果您不这样做,它会在每次请求
驱动程序的新实例时选择
container.Resolve()
,正如预期的那样。现在我看到了,谢谢您的回答!
    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));