gpt4 book ai didi

caSTLe-windsor - TypedFactoryFacility : Passing null argument

转载 作者:行者123 更新时间:2023-12-01 07:46:24 25 4
gpt4 key购买 nike

考虑以下测试:

    [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com