[英]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.