TypedFactoryFacility:传递null参数

时间:2011-02-07 20:59:27

标签: castle-windsor

考虑以下测试:

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

按预期解析组件。有没有人知道这个的解决方法,还是我必须手工处理接受空参数的工厂?

1 个答案:

答案 0 :(得分:12)

虽然你没有指定它,但我假设你的组件有一个如下所示的构造函数:

public ServiceWithDynamicDependency(string somethingDynamic) {}

您正在观察的行为不是错误 - 这是设计原因,这就是原因。

如果需要值,则必须提供实际值,并且null不被视为正确值。否则Windsor会为每个构造函数传递null,而不是为了找到它的实际依赖性而烦恼。

null是.NET中的一个特殊值,它意味着“没有价值”。因此,即使您明确提供null作为参数,Windsor也会忽略它。

要解决这个问题,请不要明确表示该值是可选的,并提供不包含它的第二个构造函数。

Windsor非常聪明,可以选择正确的构造函数,如果未提供该值(或者在您的情况下为null),它将选择无参数构造函数,并且当值存在(不为null)时,它将选择有价值的那个。