繁体   English   中英

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

[英]How to wire events with methods using 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配置用于此类任务?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM