hikalkan
hikalkan

Reputation: 2272

How to manipulate registrations from a single point in Autofac

I was using Castle Windsor to manipulate registrations. For instance, Windsor's Kernal has an event, named ComponentRegistered, where I can register to that event and add an interceptor to the service if given service/component has a specific attribute. Example:

handler.ComponentModel
       .Interceptors.Add(new InterceptorReference(typeof(UnitOfWorkInterceptor)));

I can do that conditional by checking handler.ComponentModel.Implementation type.

I'm looking a similar hook in Autofac but could not find it.

Upvotes: 2

Views: 644

Answers (1)

Cyril Durand
Cyril Durand

Reputation: 16192

You can do the same thing using Module and the AttachToComponentRegistration method. This method will be fired for each registration (present and future).

public class InterceptorModule : Module
{
    protected override void AttachToComponentRegistration(
        IComponentRegistry componentRegistry, IComponentRegistration registration)
    {
        registration.Activating += (sender, e) =>
        {
            if (e.Component.Services.Any<IService>())
            {
                e.ReplaceInstance(...);
            }
        };
        base.AttachToComponentRegistration(componentRegistry, registration);
    }
}

You will have to register this module in Autofac like this :

builder.RegisterModule(new InterceptorModule()); 

You can also use the native castle plugin :

var builder = new ContainerBuilder();
builder.RegisterType<SomeType>()
       .As<ISomeInterface>()
       .EnableInterfaceInterceptors();
builder.Register(c => new CallLogger(Console.Out));
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();

See Interceptors from the Autofac documentation for more information

Upvotes: 3

Related Questions