2

我对工厂设施有点陌生,所以如果我做的很愚蠢,请多多包涵。这是我的容器注册:

_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;
}
4

0 回答 0