Как использовать Interceptor с параметром в конструкторе для Autofac InterceptorSelector - PullRequest
0 голосов
/ 14 декабря 2018

Как использовать перехватчик в методе IInterceptorSelector.SelectInterceptors, у которого есть параметр конструктора.Я хочу позволить Autofac разрешить мой перехватчик с его параметрами, примерно такими, как в этой структуре Castle:

InterceptorReference.ForType<CallLogger>()

Я провожу исследование, но ничего не нашел.

Вот пример кода, которыйвзяты из примеров:

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        var proxyGenerationOptions = new ProxyGenerationOptions();

        //I want to use this
        //proxyGenerationOptions.Selector = new InterceptorSelector();

        builder.RegisterType<SomeType>()
            .As<ISomeInterface>()
            .EnableInterfaceInterceptors(proxyGenerationOptions)

            .InterceptedBy(typeof(CallLogger));//and remove explicit statement

        builder.Register<TextWriter>(x => Console.Out);

        builder.RegisterType<CallLogger>().AsSelf();

        var container = builder.Build();

        var willBeIntercepted = container.Resolve<ISomeInterface>();
        willBeIntercepted.Work();
    }
}

public class InterceptorSelector : IInterceptorSelector
{
    public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors)
    {
        //don't know how to solve dependency here, because it's registration time
        return new IInterceptor[] { /* new CallLogger(dependency) or InterceptorReference.ForType<CallLogger>()  */};
    }
}

public class CallLogger : IInterceptor
{
    TextWriter _output;

    public CallLogger(TextWriter output)
    {
        _output = output;
    }

    public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();

        _output.WriteLine("Done: result was {0}.", invocation.ReturnValue);
    }
}

public interface ISomeInterface { void Work(); }

public class SomeType : ISomeInterface { public void Work() { } }

Я также хотел бы знать, существует ли какой-либо механизм динамического назначения перехватчиков в Autofac.В Castle есть различные способы изменить конвейер перехвата.

1 Ответ

0 голосов
/ 15 декабря 2018

В настоящее время это невозможно в Autofac.Extras.DynamicProxy.Вы можете увидеть в источнике , что перехватчики извлекаются из свойства метаданных при регистрации (помещается туда IntereceptedBy) и не используют селектор перехватчиков.

У нас было одно примечание пользователя о том, что вы можете подключить свои собственные перехватчики, выполнив что-то вроде этого:

builder.RegisterType<Implementation>().AsSelf();
builder.Register(c =>
{
  ProxyGenerator proxyGen = new ProxyGenerator(true);
  return proxyGen.CreateInterfaceProxyWithTargetInterface<IInterfaceOfImplementation>(
    c.Resolve<Implementation>(),
    c.Resolve<ExceptionCatcherInterceptor>());
}).As<IInterfaceOfImplementation>();

Это немного более подробное руководство, но оно может привести вас туда, куда вы собираетесь.

Я добавил проблему улучшения , чтобы разобраться в этом.

...