Я немного новичок на заводе, так что, пожалуйста, потерпите меня, если я делаю глупости
Вот мой контейнер регистрации:
_container = new WindsorContainer(new XmlInterpreter());
_container.AddFacility<TypedFactoryFacility>();
_container.Register(Component
.For<ITypedFactoryComponentSelector>()
.ImplementedBy<CustomTypedFactoryComponentSelector>());
_container.Register(
Component.For<ICalcService>()
.ImplementedBy<CalcService>()
.Named("Base")
.LifeStyle.Transient,
Component.For<ICalcService>()
.ImplementedBy<AverageCalcService>()
.Named("Average")
.LifeStyle.Transient,
Component.For<ICalcServiceFactory>()
.AsFactory(c => c.SelectedWith(new CustomTypedFactoryComponentSelector())));
_container.Register(
Component.For<IEventAggregator>()
.ImplementedBy<EventAggregator>()
.LifeStyle.Singleton);
Затем я решаю с завода (я строю много из них, считанных из конфига, поэтому создаю текстовую строку)
_factory = _container.Resolve<ICalcServiceFactory>();
var averageCalc = _factory.GetByType("Average");
(например)
Что меня озадачило, так это: если я попытаюсь дать всем моим объектам вычислений базовый экземпляр, подобный этому:
public abstract class BaseCalcService : ICalcService
{
protected readonly IEventAggregator EventAggregator;
public BaseCalcService(IEventAggregator eventAggregator)
{
EventAggregator = eventAggregator;
}
...
и выведите вот так
public class AverageCalcService : BaseCalcService
{
public AverageCalcService(IEventAggregator eventAggregator) : base(eventAggregator)
{
}
...
затем CW недоволен отсутствием конструктора по умолчанию.
Вопрос: Как настроить средство фабрики, чтобы разрешить внедрение (автоматически) экземпляра EventAggregator, когда я использую фабрику для создания объекта calc?
Заранее спасибо.
Редактировать: вот мой CustomTypedFactoryComponentSelector:
public class CustomTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
if (method.Name == "GetByType" && arguments.Length == 1 && arguments[0] is string)
{
return (string)arguments[0];
}
return base.GetComponentName(method, arguments);
}
}
Редактировать: вот EventAggregator. Ничего особенного.
Интерфейс
public interface IEventAggregator
{
void SendMessage<T>(T message) where T : IEvent;
void SendMessage<T>() where T : IEvent, new();
void AddListener(IListenTo listener);
void RemoveListener(IListenTo listener);
}
И КТОР
public EventAggregator(SynchronizationContext context)
{
_context = context;
}