如何使用Autofac与方法连接事件?

时间:2014-05-28 08:04:04

标签: c# .net ioc-container autofac spring.net

是否可以通过接口/类(通过构造函数和属性注入)将事件连接到具有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配置用于此类任务?

1 个答案:

答案 0 :(得分:8)

我假设你的对象没有直接的依赖关系,比如:

    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");
    }
}

您可以使用Activated或绑定委托:

激活:

        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的用例。