Атрибут перехвата AOP - PullRequest
       20

Атрибут перехвата AOP

4 голосов
/ 01 декабря 2009

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

В настоящее время у меня есть следующее:

public interface ICustomerService
{
    Customer GetCustomer(int id);
}

public class CustomerService : ICustomerService
{
    public Customer GetCustomer(int id)
    {
        ...
    }
}

... и с Unity у меня есть настройка IOC, и в то же время настройка перехвата, как:

IUnityContainer ioc = new UnityContainer();
ioc.RegisterType<ICustomerService, CustomerService>()
    .Configure<Interception>()
    .SetInterceptorFor<ICustomerService>(new InterfaceInterceptor());

То, чего я хочу достичь, - это возможность размещать атрибуты в интерфейсе следующим образом:

public interface ICustomerService
{
    [Log]
    Customer GetCustomer(int id);
}

... определяется как:

public class LogAttribute: HandlerAttribute
{
    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new LogHandler();
    }
}  

... а затем в классе LogHandler сделать все записи, которые я хочу, как:

public class LogHandler : ICallHandler
{
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        ... log stuff
    }
}

То, чего я хочу добиться, - это система трассировки / ведения журналов, где обработчик регистрирует, как вызывается namespace.class.methodname, И родительский namespace.class.methodname, который вызвал это. Я безуспешно пытался использовать параметр «input» IMethodInvocation, чтобы получить информацию, которую я хочу, проблема заключается в том, что input возвращает интерфейс «ICustomerService», а проверка стекового фрейма для родителя возвращает реализованный класс родителя (например, . CustomerService) означает, что когда я пытаюсь создать древовидную структуру, используя namespace.class.methodname в качестве идентификаторов сущностей, идентификаторы и parentID не совпадают.

Вставка параметра в атрибут [Log] тоже не сработает, потому что я могу туда вставить? Если я добавлю имя интерфейса, у меня все еще будет та же проблема, что и выше, где идентификатор одного - это интерфейс, а родительский - реализующий класс. И я не могу поместить имя реализующего класса в атрибуте интерфейса, так как это в первую очередь противоречит цели иметь интерфейс!

Итак, это дилемма. У кого-нибудь есть свежие идеи?

Ответы [ 2 ]

1 голос
/ 08 октября 2010

У меня работает логирование с использованием Unity и Interception. Из-за моего ужасного недостатка навыков настройки конфигурации мне пришлось делать это программно. Вам необходимо настроить как минимум один перехватчик, а также один или несколько объектов политики. Ах да, UnityContainer.Configure<Interception> критически важен.

вроде как:

// I'm using the TransparentProxyInterceptor because I want to trace EVERYTHING...
var intp = myUnityContainer.Configure<Interception>().
    SetInterceptorFor(typeof(MyTypeToLog), new TransparentProxyInterceptor());

var policy = intp.AddPolicy("somePolicyName");

policy.AddMatchingRule<TypeMatchingRule>(
    new InjectionConstructor(
        new InjectionParameter(typeof(MyTypeToLog)))
          .AddCallHandler(typeof(MyCallHandler), 
               new ContainerControlledLifetimeManager());

Конечно, мне нужно также определить обработчик перехвата:

public class MyCallHandler : ICallHandler, IDisposable
{
    public IMethodReturn Invoke(IMethodInvocation input, 
        GetNextHandlerDelegate getNext)
    {
        var methodReturn = getNext().Invoke(input, getNext);

        // log everything...
        LogMethodCall(input, methodReturn);

        // log exception if there is one...
        if (methodReturn.Exception != null)
        {
            LogException(methodReturn);
        }

        return methodReturn;
    }
}
1 голос
/ 01 декабря 2009

Я закончил тем, что использовал PostSharp для ведения журнала точно так же, как это. http://www.postsharp.org

...