Я работал над тем, как я могу использовать Аспектно-ориентированное программирование, и для начала следовал этому учебному пособию . У меня это работает здесь, поэтому у меня есть до и после регистрации вызовов метода. Затем я захотел использовать этот регистратор для остальной части регистрации, которую мы обычно выполняем внутри и вокруг рассматриваемого объекта. Все, что мне нужно было сделать, чтобы это работало, это изменить последнюю строку SetParameters с:
_loggingScheduler = loggingScheduler ?? TaskScheduler.FromCurrentSynchronizationContext();
до
_loggingScheduler = loggingScheduler ?? TaskScheduler.Current;
Не уверен, почему это работает для меня, но это так. Затем я захотел использовать этот аспект / оформление, чтобы выполнить остальную часть регистрации, которая нам потребуется. Поэтому я добавил метод журнала к аспекту и использовал его соответствующим образом:
public void Log(string level, string msg)
{
Console.WriteLine($"{level} {DateTime.Now.ToString("s")} {msg}");
}
Так что пока просто ведение журнала консоли. Я использовал этот метод так:
public static void Main(string[] args)
{
var calculator = LoggingAdvice<ICalculator>.Create(
new Calculator(),
s => Console.WriteLine("Info: " + s),
s => Console.WriteLine("Error: " + s),
o => o?.ToString());
var addition = calculator.Add(2, 2);
((LoggingAdvice<ICalculator>)calculator).Log("Info", $"The result of Add was {addition}");
var subtraction = calculator.Subtract(10, 4);
((LoggingAdvice<ICalculator>)calculator).Log("Info", $"The result of Subtract was {subtraction}");
Console.WriteLine($"Results: Add - {addition}, subtract - {subtraction}");
Console.Read();
}
Реально это просто дублирование функциональности LogAfter()
. Я думал, что смогу добиться этого, используя аспект всех необходимых мне журналов:
- До и после вызова метода (отметка)
- Используйте его для навигации по объекту (отметьте галочкой)
- Вход в калькулятор (полностью застрял)
Теперь я начинаю кружить вокруг себя, и мое понимание того, что я здесь делаю, уменьшается.
Итак, мои вопросы:
- Что я здесь делаю - шаблон AOP, Decorator или Proxy (вероятно, микс)
- Могу ли я использовать аспект внутри украшенного объекта
- Должен ли я по-прежнему вводить регистратор в мои классы для внутренней регистрации
- Какое нарушение произнесено калькулятором
Так что, в основном, я немного жадный и хочу использовать аспект, который я создал, для всей моей регистрации. Это возможно?