Добавление InjectionMembers ПОСЛЕ того, как RegisterType произошло в Unity для .Net

Я использую Юнити 3.0

У меня есть этот код:

UnityConfig.Container.RegisterType<IMockProvider, MockProvider>(new PerThreadLifetimeManager(), new Interceptor<InterfaceInterceptor>(),
            new InterceptionBehavior<PerfCounterInterceptor>());

Я считаю, что это то же самое, что и эти два утверждения вместе взятые:

UnityConfig.Container.RegisterType<IMockProvider, MockProvider>(new PerThreadLifetimeManager());

UnityConfig.Container.RegisterType<IMockProvider, MockProvider>(new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PerfCounterInterceptor>());

В настоящее время у меня есть длинный список таких утверждений, как

UnityConfig.Container.RegisterType<IMockProvider, MockProvider>(new PerThreadLifetimeManager());

После этого длинного списка я хочу добавить одно и то же InterceptionBehavior ко ВСЕМ зарегистрированным типам, возможно, на основе определенных значений конфигурации. Итак, как мне «добавить одно и то же InterceptionBehavior ко ВСЕМ зарегистрированным типам» в каком-то цикле for? Я просмотрел Container.Registrations, попытался использовать IBuilderContext, но безрезультатно.

Спасибо,


person Karthik    schedule 03.01.2014    source источник


Ответы (1)


InjectionMember имеет метод AddPolicies. Это можно использовать в сочетании с IBuilderContext Свойством Policies для выполнения того, что вам нужно.

IBuilderContext context; //passed in 
InjectionMember member; //set by you

member.AddPolicies(fromType, toType, name, context.Policies);

И IBuilderContext, и ExtensionContext имеют свойство Policies и должны работать (полное раскрытие, я сделал это только с ExtensionContext), поэтому вы можете поместить свою логику в BuilderStrategy или UnityContainerExtension.

Это расширение добавит InterceptionBehavior<PerfCounterInterceptor> ко всем регистрациям на основе SomeLogic():

public class MyExtension : UnityContainerExtension
{
    protected override void Initialize()
    {
        Context.Registering += Registering;
    }

    private void Registering(object sender, RegisterEventArgs e)
    {
        if (SomeLogic())
        {
            var member = new InterceptionBehavior<PerfCounterInterceptor>();
            member.AddPolicies(e.TypeFrom, e.TypeTo, e.Name, Context.Policies);
        }
    }

    private bool SomeLogic()
    {
        return true;
    }
}

Вы просто звоните container.AddExtension(new MyExtension()), и в дальнейшем ваше поведение PerfCounterInterceptor будет добавлено ко всем регистрациям.

Изменить: для уточнения. Это расширение необходимо добавить ДО вашей регистрации. Если вам действительно нужно применить их после того, как регистрации были сделаны, вам, вероятно, придется пройтись по container.Registrations и использовать оттуда типы и имя, а не использовать событие Registering.

person Andrew Ramsay    schedule 10.07.2014