Как мне зарегистрировать интерфейсы по умолчанию в замке Виндзор с данным предком интерфейса?

У меня есть следующее:

interface IAncestor { }

interface IDescendant1 : IAncestor { }

interface IDescendant2 : IAncestor { } 

class Descendant1 : IDescendant1 { }

class Descendant2 : IDescendant2 { }

То, что я хотел бы сделать, это чтобы Виндзорский замок автоматически нашел все IDescendantX-DescendantX пары без меня, чтобы указать их вручную. Это возможно?

Я пробовал:

        container.Register(
            Classes.FromThisAssembly()
            .BasedOn<IAncestor>()
            .WithService.DefaultInterfaces()
            .LifestyleTransient()
        );

но это не находит интерфейсы по умолчанию. (У меня проблемы с формулировкой моего вопроса с правильной терминологией, поэтому я не смог найти тему на SO, которая уже отвечает на этот вопрос, извините, если это дубликат...)

1 ответ

Решение

Думаю, что проблема здесь заключается в отсутствии модификаторов доступа. Если вы добавите IncludeNonPublicTypes(), то пройдёт следующий тест:

[Test]
public void Test() 
{        
    //Arrange
    WindsorContainer sut = new WindsorContainer();

    //Act
    sut.Register(
            Classes.FromThisAssembly()
            .IncludeNonPublicTypes()
            .BasedOn<IAncestor>()
            .WithService.DefaultInterfaces()
            .LifestyleTransient());

    //Assert
    Assert.That(sut.Resolve<IDescendant1>(), Is.InstanceOf<Descendant1>());
    Assert.That(sut.Resolve<IDescendant2>(), Is.InstanceOf<Descendant2>());
}
Другие вопросы по тегам