我对工厂设施有点陌生,所以如果我做的很愚蠢,请多多包涵。这是我的容器注册:
_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 抱怨缺少默认构造函数。
问题:当我使用工厂构建 calc 对象时,如何设置工厂设施以允许 EventAggregator 实例的注入(自动)?
提前致谢。
编辑:这是我的 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);
}
}
编辑:继承事件聚合器。没什么特别的。
界面
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);
}
和 ctor
public EventAggregator(SynchronizationContext context)
{
_context = context;
}