Windsor可选构造函数参数

时间:2010-12-09 21:32:01

标签: .net dependency-injection castle-windsor

如何让Windsor尊重注射的可选构造函数参数?

我尝试制作一个IContributeComponentModelConstruction,循环遍历每个构造函数的每个ParameterInfo,并检查它是否为IsOptional,然后相应地在Windsor Dependency对象上设置IsOptional,但这似乎不起作用。我仍然得到“因为依赖而无法实例化等等。”

感谢。

更新:

我正在使用2.5.2.0 for Silverlight 4.0并且可以使用以下内容进行复制:

    var container = new WindsorContainer();
    container.Register(Component.For<TestClass>());
    container.Resolve<TestClass>(); //boom

    public class TestClass
    {
        public TestClass(ITest test=null)
        {

        }
    }

    public interface ITest
    {

    }


Missing dependency.
Component TestClass has a dependency on ITest, which could not be resolved.
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument.

1 个答案:

答案 0 :(得分:2)

在v2.5.2中。

<强>更新 我看了一眼,然后运行了你粘贴的代码,你是对的,它不起作用。 Windsor确实正确识别该参数具有默认值。然而,Windsor还有第二条规则,null永远不是必需依赖项的有效值,而第二条规则在您的情况下胜出。

这应该被视为一个错误。

要使其正常运作,您需要将DefaultDependencyResolver替换为您自己的。

你需要覆盖两种方法:来自DefaultDependencyResolver非常像这样:

public class AllowDefaultNullResolver : DefaultDependencyResolver
{
    protected override bool CanResolveServiceDependency(CreationContext context, ComponentModel model, DependencyModel dependency)
    {
        return base.CanResolveServiceDependency(context, model, dependency) || dependency.HasDefaultValue;
    }

    protected override object ResolveServiceDependency(CreationContext context, ComponentModel model, DependencyModel dependency)
    {
        try
        {
            return base.ResolveServiceDependency(context, model, dependency);
        }
        catch (DependencyResolverException)
        {
            if(dependency.HasDefaultValue)
            {
                return dependency.DefaultValue;
            }
            throw;
        }
    }
}

并使用此解析程序而不是默认解析程序。