Виндзор Необязательные параметры конструктора - PullRequest
2 голосов
/ 10 декабря 2010

Как я могу заставить Виндзор уважать необязательные параметры конструктора для инъекции?

Я попытался создать IContributeComponentModelConstruction, которая проходит через каждый ParameterInfo каждого конструктора и проверяет, является ли он IsOptional, а затем соответствующим образом устанавливает IsOptional для объекта зависимостей Windsor, но, похоже, это не сработает. Я все еще получаю «Не удалось создать экземпляр из-за зависимости ... и т. Д.».

Спасибо.

UPDATE:

Я использую 2.5.2.0 для 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 Ответ

2 голосов
/ 10 декабря 2010

В версии 2.5.2.

обновление Я посмотрел и запустил вставленный вами код, и вы правы, что он не работает.Виндзор правильно распознает, что параметр имеет значение по умолчанию.Однако у Виндзора есть и второе правило: 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;
        }
    }
}

и используйте этот распознаватель вместо используемого по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...