Как связать события с методами, использующими 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 5

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.