Как зарегистрировать открытый универсальный тип по интерфейсу с Castle Windsor?

#c# #castle-windsor

#c# #castle-windsor

Вопрос:

Я пытаюсь заставить эту регистрацию работать. У меня есть несколько IEventFactory<> ответственных за создание различных (внешних) событий в моем приложении.

Я бы хотел разрешить все виды фабрик только по его интерфейсу, например IEventFactory<ClassA> . Как мне выполнить приведенный ниже тест успешно?

 [TestFixture]
public class WindsorTests
{ 

    [Test]
    public void Test_factory_registration()
    {           

        WindsorContainer container = new WindsorContainer();
        container.AddFacility<TypedFactoryFacility>();

        container.Register(AllTypes.FromThisAssembly().BasedOn(typeof(IEventFactory<>)).WithService.AllInterfaces());

        IEventFactory<ClassA> factoryA = container.Resolve<IEventFactory<ClassA>>();
        IEventFactory<ClassB> factoryB = container.Resolve<IEventFactory<ClassB>>();

    }


    class ClassA
    {

    }

    class ClassB
    {

    }


    interface IEventFactory<TCaller>
    {
        void Foo();
    }


    class EventFactoryA : IEventFactory<ClassA>
    {

        public void Foo()
        {
            throw new NotImplementedException();
        }
    }

    class EventFactoryB : IEventFactory<ClassB>
    {

        public void Foo()
        {
            throw new NotImplementedException();
        }
    }

}
  

Ответ №1:

Ваши интерфейсы и фабрики являются частными. Либо сделайте их общедоступными / внутренними, либо добавьте IncludeNonPublicTypes() в строку регистрации.

Комментарии:

1. Спасибо! Так просто. Я только что закрыл их в своем тестовом примере 🙂

Ответ №2:

Чтобы добавить к тому, что сказал @Patrick Steele, вы, вероятно, также должны использовать .WithService.Base()

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