Как зарегистрировать открытый универсальный тип по интерфейсу с замком Виндзор? - PullRequest
1 голос
/ 09 ноября 2011

Я пытаюсь заставить эту регистрацию работать. У меня есть ряд 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();
        }
    }

}

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

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

1 голос
/ 10 ноября 2011

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

Посмотрите на документацию , которая детализирует различия.

...