Если я попытаюсь использовать перехват единства в веб-интерфейсе 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
.