Как использовать перехват единства контейнеров в asp.net-core webapi - PullRequest
0 голосов
/ 05 июня 2018

Если я попытаюсь использовать перехват единства в веб-интерфейсе asp.net-core, мои обработчики вызовов никогда не будут вызываться.Я знаю, что он работает в консольных приложениях .net-core, в неосновных приложениях и даже в тестах того же проекта, в которых нет элементов webapi (разрешение служб из тестового контейнера).

Вот (соответствующий) код, который я использую для настройки API:

В Program.cs:

.UseUnityServiceProvider()

В Startup.cs

public void ConfigureContainer(IUnityContainer container) {
    container.AddNewExtension<Interception>();
    container.RegisterType<IProjectService, ProjectService>().Configure<Interception>().SetInterceptorFor<IProjectService>(new InterfaceInterceptor());
}

public void ConfigureServices(IServiceCollection services) {
    ...
    services.AddControllersAsServices();
    ...
}

Я подозреваю, что это как-то связанос Unity.Microsoft.DependencyInjection.ServiceProvider, установленным UseUnityServiceProvider(), разрешение типов таким образом, что перехват не включается.

Так что мне нужно сделать, чтобы перехват работал так, как должен?Или это известная ошибка где-то?

[Обновление]

@ Альберт: Вы имеете в виду что-то вроде этого:

container.RegisterType<IProjectService, ProjectService>(new InterceptionBehavior<PolicyInjectionBehavior>()); // new Interceptor<InterfaceInterceptor>()

Даже когда я добавляю InterfaceInterceptor в качестве второгопараметр, который ничего не меняет.

Еще немного информации о HandlerAttribute и CallHandler, которые я использую для тестирования:

public class DummyLoggingAttribute : HandlerAttribute {
    public override ICallHandler CreateHandler(IUnityContainer container) 
        return new DummyLoggerCallHandler(){Order = 2};
    }
}

public class DummyLoggerCallHandler : ICallHandler{
    private int _order;

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) {
        Console.WriteLine("log vor ");

        IMethodReturn result = getNext()(input, getNext);

        Console.WriteLine("log danach ");
        return result;
    }

    public int Order {
        get { return _order; }
        set { _order = value; }
    }
}

Применяется к методу следующим образом.

[DummyLogging]
public virtual IList<Project> GetAllProjects() {
    return _projectDao.GetAll();
}

Это даже не имеет никакого значения, если я добавлю Атрибут к интерфейсу, реализации или обоим.

Я другое консольное приложение .net-core. Я даже могу успешно использовать следующее расширение для автоматической настройки каждой регистрации.тип для перехвата.

/// <summary>
///     Extension für das automatische Intercepten von Methoden
/// </summary>
public class InterceptionExtension : UnityContainerExtension {
    /// <summary>
    ///     Entfernt die Extension
    /// </summary>
    public override void Remove() {
        Context.Registering -= OnRegister;
        Context.RegisteringInstance -= OnRegisterInstance;
    }

    /// <summary>
    ///     Initialisiert die Extension
    /// </summary>
    protected override void Initialize() {
        Container.AddNewExtension<Interception>();

        Context.Registering += OnRegister;
        Context.RegisteringInstance += OnRegisterInstance;
    }

    /// <summary>
    ///     Event wenn ein Type Registriert wird
    /// </summary>
    private void OnRegister(object sender, RegisterEventArgs e) {
        if (e.TypeFrom != null) {
            Container.Configure<Interception>()
                    .SetInterceptorFor(e.TypeFrom, new InterfaceInterceptor());
        }
    }

    /// <summary>
    ///     Event wenn eine Instance Regestriert wird
    /// </summary>
    private void OnRegisterInstance(object sender, RegisterInstanceEventArgs e) {
        Container.Configure<Interception>()
                .SetInterceptorFor(e.RegisteredType, new InterfaceInterceptor());
    }
}

Что приводит меня к предположению, что проблема заключается не в регистрации перехвата, а в разрешении служб через UnityServiceProvider.

1 Ответ

0 голосов
/ 06 июня 2018

Я не уверен, что это ответ на вопрос.Как я понимаю, исходная проблема заключается в том, что прокси-класс, который должен перехватывать вызовы методов ProjectService, не создается.Я смог исправить это, создав класс, производный от IInterceptionBehavior и немного другой регистрации типов.

MyInterceptionBehavior:

public class MyInterceptionBehavior : IInterceptionBehavior
{
    public bool WillExecute
    {
        get { return true; }
    }

    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return Enumerable.Empty<Type>();
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        IMethodReturn result = getNext()(input, getNext);
        Console.WriteLine("Interception Called");
        return result;
    }

}

И в ConfigureContainer() замените свою IProjectService регистрацию следующим:

container.RegisterType<IProjectService, ProjectService>(
    new Interceptor<InterfaceInterceptor>(),
    new InterceptionBehavior<MyInterceptionBehavior>());

Invoke метод вызывается каждый раз, когда вызывается каждый метод IProjectService.Я надеюсь, что это даст вам некоторую идею или поможет заставить вас перехватывать поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...