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