caSTLe-windsor - TypedFactoryFacility : Passing null argument

标签 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");

该组件已按预期解析。有没有人知道解决这个问题的方法,或者我是否必须手动滚动接受空参数的工厂?

最佳答案

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

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/

相关文章:

dependency-injection - 有没有办法在使用 HttpSelfHostServer 运行的 Web Api 中添加 httpModule?

c# - CaSTLe 接口(interface)的动态代理而不是派生类

c# - CaSTLe Windsor 3.1 缺少方法异常

caSTLe-windsor - 使用 CaSTLe Windsor 注入(inject)多个服务实现

c# - 通过 CaSTLe Windsor 中的属性注入(inject)进行循环依赖

c# - 如何在 VB.NET 或 C# 中将此 WindsorControllerFactory 转换为 UnityControllerFactory

c# - CaSTLe Windsor - 如何在构造函数注入(inject)中映射命名实例

c# - IOC/DI CaSTLeWindsor 每次都返回相同的实例

c# - "Common Language Runtime detected an invalid program"位于带有 CaSTLe Windsor 的 Azure Web 角色上

.net - 对非拦截方法内的属性的调用不会转发到目标对象