топике народ обсуждает новую экспериментальную фичу C# — Interceptors. При этом некоторые коллеги выразили сомнения, что это фича рабочая в частности для AOP.
В качестве подтверждения того, что это не так предлагаю взглянуть на проект, где это уже в определённой степени реализовано и некоторым образом работает.
По сути это реинкарнация аспектов из BLToolkit, кроме реализации самих аспектов. Сами аспекты предлагается реализовывать пользователям, т.к. с этим генератором это делается максимально просто (хотелось бы в это верить).
Пример для OpenTelemetry:
using System;
using System.Diagnostics;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace Aspects
{
/// <summary>
/// Initializes OpenTelemetry.
/// </summary>static class OpenTelemetryFactory
{
public static TracerProvider? Create()
{
return Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MySample"))
.AddSource("Sample.Aspect")
.AddConsoleExporter()
.Build();
}
}
/// <summary>
/// Metrics aspect.
/// </summary>
[Aspect(
OnUsing = nameof(OnUsing),
OnFinally = nameof(OnFinally)
)]
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
sealed class MetricsAttribute : Attribute
{
static readonly ActivitySource _activitySource = new("Sample.Aspect");
public static Activity? OnUsing(InterceptCallInfo info)
{
var activity = _activitySource.StartActivity(info.MemberInfo.Name);
info.Tag = activity;
return activity;
}
public static void OnFinally(InterceptCallInfo info)
{
if (info is { Tag: Activity activity, Exception: var ex })
activity.SetStatus(ex is null ? ActivityStatusCode.Ok : ActivityStatusCode.Error);
}
}
}
Пример использования:
using System;
using System.Threading;
using Aspects;
namespace OpenTelemetryAspect
{
static class Program
{
static void Main()
{
using var _ = OpenTelemetryFactory.Create();
Method1();
Method2();
Method1();
try
{
ExceptionMethod();
}
catch
{
// ignored
}
}
[Metrics]
public static void Method1()
{
Thread.Sleep(100);
}
[Metrics]
public static void Method2()
{
Thread.Sleep(200);
}
[Metrics]
public static void ExceptionMethod()
{
throw new();
}
}
}
топике народ обсуждает новую экспериментальную фичу C# — Interceptors. При этом некоторые коллеги выразили сомнения, что это фича рабочая в частности для AOP.
Не понятно зачем это тащить в язык, если через IoC-контейнеры уже сто лет делается без проблем. Как в MetricsAttribute предлагается инжектить зависимости? В предложенном примере — глобальные переменные во всей красе.
Re[2]: Aspect Generator (по мотивам "Новости C#12")
Здравствуйте, rosencrantz, Вы писали:
R>Не понятно зачем это тащить в язык, если через IoC-контейнеры уже сто лет делается без проблем. Как в MetricsAttribute предлагается инжектить зависимости? В предложенном примере — глобальные переменные во всей красе.
Это другое.
Если нам не помогут, то мы тоже никого не пощадим.
Предлагаю еще добавить фичу обертки метода по комментарию.
Часто нужно создать отдельную сборку с большей информацией о параметрах и возвратах в определенных местах
и солнце б утром не вставало, когда бы не было меня
Re[2]: Aspect Generator (по мотивам "Новости C#12")
Здравствуйте, Serginio1, Вы писали:
S>Предлагаю еще добавить фичу обертки метода по комментарию. S>Часто нужно создать отдельную сборку с большей информацией о параметрах и возвратах в определенных местах
Не понял.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Aspect Generator (по мотивам "Новости C#12")
Здравствуйте, IT, Вы писали:
S>>Предлагаю еще добавить фичу обертки метода по комментарию. S>>Часто нужно создать отдельную сборку с большей информацией о параметрах и возвратах в определенных местах
IT>Не понял.
// Помечаю метод каким то определенным комментарием
Method1();
Причем другие вызовы этого метода меня не интересуют. Только в конкретном месте. Там может несколько методов, что бы получить более детальную информацию.
и солнце б утром не вставало, когда бы не было меня
Очень прошу прощения за оффтоп, но Вы можете кого-нибудь пнуть из ответственных лиц с целью починки почты?
Ну или хотя бы причины озвучить, почему не работает -- забанили где-то, сломалось что-то или надо проплатить
чего-то?