考虑以下测试:
[Test]
public void Create_ServiceWithDynamicDependency_Created()
{
// arrange
IWindsorContainer container = new WindsorContainer();
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IServiceFactory>().AsFactory());
container.Register(Component.For<ServiceWithDynamicDependency>().LifeStyle.Transient);
container.Register(Component.For<SomethingStatic>().LifeStyle.Transient);
var factory = container.Resolve<IServiceFactory>();
// act
ServiceWithDynamicDependency serviceWithDynamicDependency = factory.Create(null);
// assert
Assert.That(serviceWithDynamicDependency, Is.Not.Null);
}
此操作失败,出现以下异常:无法解析'Testing.Windsor.Factory.ServiceWithDynamicDependency'(Testing.Windsor.Factory.ServiceWithDynamicDependency)的非可选依赖项。参数'somethingDynamic'输入'System.String'
如果我用这个替换断言部分:
ServiceWithDynamicDependency serviceWithDynamicDependency = factory.Create("foo");
按预期解析组件。有没有人知道这个的解决方法,还是我必须手工处理接受空参数的工厂?
答案 0 :(得分:12)
虽然你没有指定它,但我假设你的组件有一个如下所示的构造函数:
public ServiceWithDynamicDependency(string somethingDynamic) {}
您正在观察的行为不是错误 - 这是设计原因,这就是原因。
如果需要值,则必须提供实际值,并且null
不被视为正确值。否则Windsor会为每个构造函数传递null
,而不是为了找到它的实际依赖性而烦恼。
null
是.NET中的一个特殊值,它意味着“没有价值”。因此,即使您明确提供null
作为参数,Windsor也会忽略它。
要解决这个问题,请不要明确表示该值是可选的,并提供不包含它的第二个构造函数。
Windsor非常聪明,可以选择正确的构造函数,如果未提供该值(或者在您的情况下为null),它将选择无参数构造函数,并且当值存在(不为null)时,它将选择有价值的那个。