TypedFactoryFacility: передача нулевого аргумента - PullRequest
3 голосов
/ 07 февраля 2011

Рассмотрим следующий тест:

    [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),Параметр'thingDynamic ', тип' System.String '

Если я заменю часть подтверждения следующим образом:

        ServiceWithDynamicDependency serviceWithDynamicDependency = factory.Create("foo");

Компонент разрешен, как и ожидалось.Кто-нибудь знает об обходном пути для этого, или я должен свернуть фабрики, которые принимают нулевые аргументы?

1 Ответ

12 голосов
/ 08 февраля 2011

Хотя вы не указали его, я предполагаю, что у вашего компонента есть один конструктор, который выглядит следующим образом:

public ServiceWithDynamicDependency(string somethingDynamic) {}

Поведение, которое вы наблюдаете, не является ошибкой - оно разработано, и вот почему.

Если требуется значение, необходимо указать фактическое значение, а null не считается правильным значением. В противном случае Windsor будет просто передавать null для каждого конструктора, вместо того, чтобы искать фактические зависимости для этого.

null - это специальное значение в .NET, которое означает «нет значения». Поэтому, даже если вы явно предоставите null в качестве аргумента, Виндзор проигнорирует его.

Чтобы решить эту проблему, вместо того, чтобы обойти это явным образом, укажите, что значение является необязательным, и предоставьте второй конструктор, который его не включает.

Виндзор достаточно умен, чтобы выбрать правильный конструктор, и если значение не указано (или ноль, как в вашем случае), он выберет конструктор без аргументов, а когда значение будет (не ноль), он выберет один со значением.

...