考虑以下测试:
[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");
该组件已按预期解析。有没有人知道解决这个问题的方法,或者我是否必须手动滚动接受空参数的工厂?
最佳答案
尽管您没有指定它,但我假设您的组件有一个如下所示的构造函数:
public ServiceWithDynamicDependency(string somethingDynamic) {}
您观察到的行为不是错误 - 这是设计使然,原因如下。
如果需要值,则必须提供实际值,并且
null
不被认为是正确的值。否则温莎只会路过null
在每个构造函数中,而不是费心去寻找实际的依赖关系。null
是 .NET 中的一个特殊值,它的意思是“没有值(value)”。因此,即使您明确提供 null
作为一个论点,温莎将忽略它。为了解决这个问题,不要明确指出该值是可选的,而是提供一个不包含它的第二个构造函数。
Windsor 足够聪明,可以选择正确的构造函数,如果未提供该值(或在您的情况下为 null),它将选择无参数构造函数,并且当该值存在(不为 null)时,它将选择具有值(value)。
关于caSTLe-windsor - TypedFactoryFacility : Passing null argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4926508/