TypedFactoryFacility:传递null参数

Mar*_*ius 3 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);
    }
Run Code Online (Sandbox Code Playgroud)

此操作失败,出现以下异常:无法解析'Testing.Windsor.Factory.ServiceWithDynamicDependency'(Testing.Windsor.Factory.ServiceWithDynamicDependency)的非可选依赖项.参数'somethingDynamic'类型'System.String'

如果我用这个替换断言部分:

        ServiceWithDynamicDependency serviceWithDynamicDependency = factory.Create("foo");
Run Code Online (Sandbox Code Playgroud)

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

Krz*_*mic 12

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

public ServiceWithDynamicDependency(string somethingDynamic) {}
Run Code Online (Sandbox Code Playgroud)

你正在观察的行为不是一个错误 - 这是设计,这就是原因.

如果需要值,则必须提供实际值,并且null不认为该值是正确的值.否则Windsor会null为每个构造函数传入而不是为了找到实际的依赖关系而烦恼.

null是.NET中的一个特殊值,它意味着"没有价值".因此即使你明确提供null作为参数,温莎也会忽略它.

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

Windsor很聪明,可以选择正确的构造函数,如果没有提供值(或者在你的情况下为null),它将选择无参数构造函数,当值存在(不为null)时,它将选择一个价值.