2011-02-07 112 views
3

考虑以下测试:TypedFactoryFacility:传递null参数

[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"); 

预期的组件解决。有没有人知道这个解决方法或我必须手动滚动接受空参数的工厂?

回答

12

你虽然没有指明它我假设你的组件具有一个构造函数如下:

public ServiceWithDynamicDependency(string somethingDynamic) {} 

你观察到的行为是不是一个错误 - 这是由设计,和这里的为什么。

如果需要值,则必须提供实际值,并且null不被视为正确的值。否则,温莎只会通过null为每个构造函数,而不是打扰找到实际的依赖关系。

null是.NET中的一个特殊值,它表示“没有价值”。所以,即使你明确提供null作为温莎将会忽略它的一个论据。

为了解决这个问题,我们并没有明确指出这个值是可选的,而是提供了第二个不包含它的构造函数。如果没有提供值(或者在你的情况下为null),它将选择无参数的构造函数,并且当值存在时(非空值),它将会选择一个具有价值的人。

+0

+1 this解释了很多 – ktutnik 2012-07-10 06:52:53