C# 如何使用Autofac将事件与方法关联起来?

C# 如何使用Autofac将事件与方法关联起来?,c#,.net,ioc-container,autofac,spring.net,C#,.net,Ioc Container,Autofac,Spring.net,是否可以通过接口/类(通过构造函数和属性注入)将事件连接到带有Autofac的方法,而不是整个对象。我想在函数级而不是类型级绑定。在编程方面,我希望(用C#)完成以下工作: 例如,Spring.net确实支持以下构造来实现这一点: <object id="SomeType" type="Whatever.SomeType, Whatever" /> <object id="SomeOtherType" type="Whatever.SomeOtherType, Whatever

是否可以通过接口/类(通过构造函数和属性注入)将事件连接到带有Autofac的方法,而不是整个对象。我想在函数级而不是类型级绑定。在编程方面,我希望(用C#)完成以下工作:

例如,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");
    }
}
您可以使用激活的或绑定的委托:

激活:

        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();
ContainerBuilder cb=newcontainerbuilder();
cb.RegisterType();
cb.RegisterType()
.on已激活(act=>
{ 
var other=act.Context.Resolve();
act.Instance.Input+=other.Output;
});
var container=cb.Build();
var obj2=container.Resolve();
obj2.Raise();
委托版本,将注册替换为:

        cb.Register(ctx =>
        {
            var other = ctx.Resolve<SomeOtherType>();
            var obj = new SomeType();
            obj.Input += other.Output;
            return obj;
        }).As<SomeType>();
cb.寄存器(ctx=>
{
var other=ctx.Resolve();
var obj=new SomeType();
对象输入+=其他输出;
返回obj;
}).As();
作为旁注,执行这种类型的绑定有时可能有点危险(因为您创建了一个事件依赖项)并导致内存泄漏

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


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

您是说上面的示例会产生内存泄漏吗?为什么?没有圆圈或者我错过了什么+1供您输入(如果没有更好的想法出现,我可能会在几天内将此作为公认的答案)好的,这可能有点过于令人担忧;)除非SomeType是一个长寿命的对象,而SomeOtherType是一个短命的对象(因为现在SomeType持有对SomeOtherType的引用),否则您会非常安全。这也可以通过xml配置实现吗?据我所知(通过查看autoface源代码和文档),它看起来不像是通过xml配置实现的。为什么不使用类呢?您是否考虑过第三个适配器类,
someType
someOtherType
都依赖于哪个类作为这两个类的中间人?是的,可能的解决方案是,但只需要编写额外的类来连接事件和订阅者。尽管有一个更简单的方法。
        cb.Register(ctx =>
        {
            var other = ctx.Resolve<SomeOtherType>();
            var obj = new SomeType();
            obj.Input += other.Output;
            return obj;
        }).As<SomeType>();