Is it possible to wire events to methods with Autofac instead of whole object via interfaces/classes (through constructor and property injection). I want to bind at function level instead of type level. Programmatically I expect the following job to be done (in C#):
someType.Output += someOtherType.Input;
For example Spring.net does support the following construct to achieve that:
<object id="SomeType" type="Whatever.SomeType, Whatever" />
<object id="SomeOtherType" type="Whatever.SomeOtherType, Whatever">
<listener event="Output" method="Input">
<ref object="SomeType" />
</listener>
</object>
Is Autofac able to do that and how? Is it possible to use xml config for such a task?
AutoFac provides better integration for the ASP.NET MVC framework and is developed using Google code. AutoFac manages the dependencies of classes so that the application may be easy to change when it is scaled up in size and complexity.
Autofac is an addictive IoC container for . NET. It manages the dependencies between classes so that applications stay easy to change as they grow in size and complexity. This is achieved by treating regular .
I assume that you objects have no direct dependency together, like :
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");
}
}
You can either use Activated or bind a delegate:
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();
Delegate version, replace registration by:
cb.Register(ctx =>
{
var other = ctx.Resolve<SomeOtherType>();
var obj = new SomeType();
obj.Input += other.Output;
return obj;
}).As<SomeType>();
As a side note, doing this type of binding can sometimes be a bit dangerous (as you create an event dependency) and create memory leak.
Creating a small class that attach both elements and implement IDisposable to unregister event when not needed anymore could be a sensible option.
I don't think it is possible to wire events via xml configuration, and for this type of binding I would largely prefer the compile time safety offered by code, but maybe you have a use case for xml.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With