использование пользовательских атрибутов C # для исключения и ведения журнала аудита - PullRequest
8 голосов
/ 23 декабря 2010

возможно ли создать пользовательскую функцию, которая фиксирует исключения, сделанные в методе, заданном пользовательским атрибутом?

Я планирую сделать что-то вроде этого:

[Logging(FeatureEnum.SomeFeature, IntentEnum.SomeIntent, "some comment")]
public void SomeMethodThatDoesATask()
{
    try
    {
      var doSomeAction = new LazyProcess();
      doSomeAction.WhoDunnit();
    }
    catch(Exception ex)
    {
       StaticMethodThatDoesLogging.CatchError(ex);
    }
}

Вопрос: Как мне записать имя метода, где был размещен этот атрибут и какое событие было сгенерировано? Он может либо захватить исключение, либо просто автоматически записать, что этот метод был вызван.

Ответы [ 3 ]

5 голосов
/ 23 декабря 2010

Это не может быть легко достигнуто. Например, TypeMock использует API профилировщика .NET Framework для мониторинга выполнения приложения. Он позволяет вам регистрироваться для различных событий и получать уведомления при вызове метода, возникает исключение, ... но это не будет легкой задачей.

С другой стороны, вы можете использовать AOP, но это требует, чтобы вы изменили свой код, чтобы вызывающий использовал некоторый сгенерированный прокси вместо реального класса. Spring.NET обладает некоторыми приятными особенностями.

Таким образом, в основном без использования .NET Framework Profiler API или без написания некоторого пользовательского кода, который считывает эти атрибуты из данного класса с использованием отражения, вы не сможете достичь этого. Атрибуты - это просто метаданные класса, и без чего-либо, что имело бы смысл, они ничего не делают.

1 голос
/ 23 декабря 2010

Атрибуты - это просто метаданные. Вам нужно было бы выполнить переплетение кода, используя что-то вроде PostSharp, или использовать библиотеку перехвата времени выполнения, такую ​​как Castle.DynamicProxy. Сами по себе атрибуты не содержат никакой реальной функциональности для приложения, кроме как через отражение.

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

public void CatchError(Exception ex)
{
    StackFrame parentFrame = new StackFrame(1);
    MethodBase mi = parentFrame.GetMethod();
    LoggingAttribute attr = mi.GetCustomAttributes(typeof(LoggingAttribute), true).FirstOrDefault() as LoggingAttribute;

    if (attr != null)
    {
       // do your logging.
    }
}
1 голос
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...