Используя ваш опубликованный код, я не могу воспроизвести проблему, которую вы описываете.Перехватчик получает удар, и все работает нормально.
Однако мне пришлось сделать три изменения, чтобы опробовать его.
- Я переключил метод
ServiceInterface.GetUser
, чтобы просто вернуть строку.У меня нет ваших объектов данных или чего-то еще.Я бы порекомендовал удалить этот материал из репродукции в вопросе, если он не важен для общего вопроса. - Я удалил
InterceptedBy(typeof(Logger))
.Это не нужно для атрибутов, хотя я вижу комментарий, в котором говорится, что вы пытались это сделать. - Я удалил дубликат
builder.Build()
из метода Interceptor.Configure()
.Это на самом деле вызовет исключение при попытке построить контейнер во второй раз.
Элемент № 3 касается меня, поскольку это означает, что в репро потенциально могут отсутствовать некоторые вещи, вызывающие проблему (и, возможно, выне пробовали репродукцию до публикации?).
В любом случае, вот полностью работающее консольное приложение, использующее ваш код:
using Autofac;
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;
using System;
namespace InterfaceInterception
{
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.Register(a => new Logger());
builder.RegisterType<ServiceProxy>().As<ServiceInterface>().EnableInterfaceInterceptors();
var container = builder.Build();
var worker = container.Resolve<ServiceInterface>();
Console.WriteLine(worker.GetUser("", ""));
Console.ReadKey();
}
}
public class Logger : IInterceptor
{
public void Intercept(IInvocation invocation)
{
var watch = System.Diagnostics.Stopwatch.StartNew();
invocation.Proceed();
watch.Stop();
var executionTime = watch.ElapsedMilliseconds;
Console.WriteLine("Execution time: {0}", executionTime);
}
}
[Intercept(typeof(Logger))]
public class ServiceProxy : ServiceInterface
{
public string GetUser(String username, String password)
{
return "a";
}
}
public interface ServiceInterface
{
string GetUser(String username, String password);
}
}
Вывод на консоль будет выглядеть следующим образом:
Execution time: 1
a
Вы можете установить точку останова в перехватчике, и она будет поражена.Вывод консоли показывает, что его тоже ударили.Итак ... что-то еще происходит, возможно, в коде вашего приложения, что вызывает проблемы, которые вы видите.Репродукция здесь выглядит [в основном] хорошо.