Как получить экземпляр, созданный на заводе в Касл-Виндзоре, для инженера-конструктора? - PullRequest
2 голосов
/ 23 августа 2011

Я немного новичок на заводе, так что, пожалуйста, потерпите меня, если я делаю глупости Вот мой контейнер регистрации:

_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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...