Set Default Interceptor Unity Extension

With Unity, it is quite easy to implement an extension that automatically sets the appropriate interceptor for each registered type.

Here is how I did it:

public class DefaultInterceptorInterceptionExtension : Interception

{

     private static readonly IInterceptor [] interceptors = null;    static DefaultInterceptorInterceptionExtension()

    {

        interceptors = (from interceptorType in

        (from type in typeof(IInterceptor).Assembly.GetExportedTypes()

        where typeof(IInterceptor).IsAssignableFrom(type) &&

        type.IsAbstract == false &&

        type.IsInterface == false

        select type)        select Activator.CreateInstance(interceptorType) as IInterceptor).ToArray();

    }

    protected override void Initialize()

    {

        base.Initialize();

        IConfigurationSource configSource = ConfigurationSourceFactory.Create();

        PolicyInjectionSettings section = configSource.GetSection(PolicyInjectionSettings.SectionName) as PolicyInjectionSettings;

        if (section != null)

        {

            section.ConfigureContainer(
this.Container, configSource);

        }

        this.Context.Registering += new EventHandler<RegisterEventArgs>

        (

            delegate(Object sender, RegisterEventArgs e)

            {

                this.setInterceptorFor(e.TypeFrom, e.TypeTo, e.Name);

            }

        );

        this.Context.RegisteringInstance += new EventHandler<RegisterInstanceEventArgs>

        (

            delegate(Object sender, RegisterInstanceEventArgs e)

            {

                this.setInterceptorFor(e.RegisteredType, e.Instance.GetType(), e.Name);

            }

        );

    }

    private void setInterceptorFor(Type typeToIntercept, Type typeOfInstance, String name)

    {

        foreach (IInterceptor interceptor in interceptors)

        {

            if ((interceptor.CanIntercept(typeToIntercept) == true) && (interceptor.GetInterceptableMethods(typeToIntercept, typeOfInstance).Count() != 0))

            {

                if (interceptor is IInstanceInterceptor)

                {

                    this.Container.Configure<Interception>().SetDefaultInterceptorFor(typeToIntercept, interceptor as IInstanceInterceptor);

                }

                else if (interceptor is ITypeInterceptor)

                {

                    this.Container.Configure<Interception>().SetDefaultInterceptorFor(typeToIntercept, interceptor as ITypeInterceptor);

                }

                break;

            }

        }

    }

}

And you register with like this:

<unity>

    <typeAliases>

        <typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

        <typeAlias alias="transient" type="Microsoft.Practices.Unity.TransientLifetimeManager, Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

        <typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

        <typeAlias alias="thread" type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

    </typeAliases>

    <containers>

        <container>

            <extensions>

                <add type="DefaultInterceptorInterceptionExtension, SomeAssembly" />

            </extensions>

        </container>

    </containers>

<unity>

Bookmark and Share

                             

3 Comments

Comments have been disabled for this content.