2013-03-31 4 views
1

Unity Interception может использоваться для перехвата метода и может захватывать значения параметров метода перехвата.Инструменты AOP для регистрации с локальными переменными метода C#

Я хочу, чтобы регистрировать значения локальных переменных в методе перехвата. Например

Update

public void CopyBlogPost(int id){ 

    var oldblogPost = GetBlogPost(id); 

    //log details about old blog post, including name, date, id etc. 

    //copy post 

//log details about new blog post, including name, date, id etc. 

} 

Есть ли инструмент, который я могу использовать для этого сценария?

Обновление

Как следует @Aron, Mono.Cecil может обеспечить функциональные возможности.

+0

Это может быть сделано только с использованием ткачества IL. Unity Interception может использовать метаданные метода для разработки параметров и т. Д. Однако внутренняя работа невозможна, поскольку, с одной стороны, компилятор может встраивать переменные и т. Д. Только ваши настройки компилятора могут иметь эффект. PS IL Weaving очень тяжело. – Aron

+0

Существуют ли другие инструменты, которые имеют функциональность? – Pingpong

+0

Почему бы вам не обновить свой вопрос и не дать нам больше информации о реальной проблеме, которую вы пытаетесь решить. Я не могу представить, что вы действительно хотите сделать это с помощью метода «Добавить». Поступая таким образом, мы можем дать вам отзывы о вашем дизайне. – Steven

ответ

0

Что вы можете сделать, это определить декоратор, как это:

public class LoggingCalculatorDecorator : ICalculator 
{ 
    private readonly ICalculator decoratee; 
    private readonly ILogger logger; 

    public LoggingCalculatorDecorator(
     ICalculator decoratee, 
     ILogger logger) 
    { 
     this.decoratee = decoratee; 
     this.logger = logger; 
    } 

    public void Add(int i, int j) 
    { 
     var logging = "adding "+i+" "+j; 
     //Log logging variable, or any local variables 

     // call decoratee 
     this.decoratee.Add(i, j); 
    } 
} 

Таким образом, вы можете добавить это поведение к существующему классу без необходимости его изменить. Если вы обнаружите, что во всей системе много декораторов оформления (и нарушает принцип DRY), вы, вероятно, не видите общей абстракции в системе. Взгляните на статью this и this. Возможно, вы узнаете, как создать свою систему таким образом, чтобы вам не приходилось отвлекаться на перехват и перекодирование кода, но решайте основные проблемы: дизайн вашего приложения.

+0

Предоставленный код может быть решением для этого сценария. Но это не идеал, потому что локальные переменные меняются. Например, запись локальных переменных в Add(), которые невозможно декорировать. Но, как вы говорите, если такого инструмента нет, мне, возможно, придется рассмотреть общий уровень абстракции. Я посмотрю на статьи. Благодарю. – Pingpong

+0

ОП запросил переменную регистрацию. У вас есть запись ARGUMENT. – Aron

+0

@Pingpong: Извините, я пропустил «лог-значения локальных переменных в методе перехвата». Не имея больше информации о вашем типичном случае, я бы сказал, что вы делаете это неправильно. Когда вы пишете SOLID-код, вероятность того, что вам нужно сделать такую ​​вещь, очень редка. Но если вам это нужно, ваш единственный вариант - использовать инструменты ткачества кода (как сказал Арон), такие как PostSharp. – Steven

Смежные вопросы