Как связать события с методами, использующими Autofac?
Можно ли передавать события в методы с Autofac вместо всего объекта через интерфейсы / классы (через конструктор и инъекцию свойств). Я хочу связать на уровне функций, а не на уровне типов. Программно я ожидаю, что будет выполнена следующая работа (в C#):
someType.Output += someOtherType.Input;
Например Spring.net поддерживает следующую конструкцию для достижения этого:
<object id="SomeType" type="Whatever.SomeType, Whatever" />
<object id="SomeOtherType" type="Whatever.SomeOtherType, Whatever">
<listener event="Output" method="Input">
<ref object="SomeType" />
</listener>
</object>
Способен ли Autofac сделать это и как? Можно ли использовать xml config для такой задачи?
1 ответ:
Я предполагаю, что ваши объекты не имеют прямой зависимости друг от друга, например:
public class SomeType { public event EventHandler Input; public void Raise() { if (Input != null) { Input(this, new EventArgs()); } } } public class SomeOtherType { public void Output(object source, EventArgs handler) { Console.WriteLine("Handled"); } }
Вы можете использовать активированный или привязать делегат:
Активировано:
ContainerBuilder cb = new ContainerBuilder(); cb.RegisterType<SomeOtherType>(); cb.RegisterType<SomeType>() .OnActivated(act => { var other = act.Context.Resolve<SomeOtherType>(); act.Instance.Input += other.Output; }); var container = cb.Build(); var obj2 = container.Resolve<SomeType>(); obj2.Raise();
Версия делегата, заменить регистрацию на:
cb.Register(ctx => { var other = ctx.Resolve<SomeOtherType>(); var obj = new SomeType(); obj.Input += other.Output; return obj; }).As<SomeType>();
В качестве дополнительного замечания, выполнение такого типа привязки иногда может быть немного опасным (поскольку вы создаете зависимость от события) и создавать утечку памяти.
Создание небольшого класса, который присоединяет оба элемента и реализует IDisposable для отмены регистрации события, когда это не так. необходимость больше не может быть разумным вариантом.
Я не думаю, что можно передавать события через xml-конфигурацию, и для этого типа привязки я бы в значительной степени предпочел безопасность времени компиляции, предлагаемую кодом, но, возможно, у вас есть вариант использования xml.