gpt4 book ai didi

c# - 如何使用 Autofac 使用方法连接事件?

转载 作者:太空狗 更新时间:2023-10-29 21:17:28 25 4
gpt4 key购买 nike

是否可以通过接口(interface)/类(通过构造函数和属性注入(inject))将事件连接到 Autofac 方法而不是整个对象。我想在函数级别而不是类型级别进行绑定(bind)。我希望以编程方式完成以下工作(在 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 或绑定(bind)委托(delegate):

激活:

        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();

委托(delegate)版本,将注册替换为:

        cb.Register(ctx =>
{
var other = ctx.Resolve<SomeOtherType>();
var obj = new SomeType();
obj.Input += other.Output;
return obj;
}).As<SomeType>();

附带说明一下,进行这种类型的绑定(bind)有时会有点危险(因为您创建了事件依赖性)并且会造成内存泄漏。

创建一个附加两个元素并实现 IDisposable 的小类以在不再需要时注销事件可能是一个明智的选择。

我认为不可能通过 xml 配置连接事件,对于这种类型的绑定(bind),我更喜欢代码提供的编译时安全性,但也许您有 xml 的用例。

关于c# - 如何使用 Autofac 使用方法连接事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23905944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com