#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()
Взгляните на документацию, в которой подробно описаны различия.