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