Совет относительно AOP с [закрытым] C#

10
задан 2 revs 23 May 2017 в 11:48
поделиться

3 ответа

Краткий ответ, для простоты и легкости использования, вы действительно не ошибетесь с PostSharp.

Более длинный ответ: на мой взгляд, вам следует выбирать между двумя структурами в зависимости от того, чего вы пытаетесь достичь.

Если вам нужны аспекты, которые должны изменяться в зависимости от контекста, рассмотрите Spring.NET (или любую платформу AOP, которая внедряет код во время выполнения на основе конфигурации). Это позволяет вам настраивать поведение ваших объектов в зависимости от того, что вы делаете. Например, через вашу конфигурацию вы можете использовать один тип регистрации в консольном приложении, а другой - в веб-приложении.Обратите внимание, что Spring также является контейнером DI (и некоторыми другими вещами) - он выходит далеко за рамки АОП, и его определенно стоит изучить, как его использовать.

С другой стороны, если вам нужно поведение, которое должно всегда действовать, независимо от контекста, то PostSharp (ткачество времени компиляции) - ваш лучший выбор. Это фактически то же самое, как если бы вы включали код в каждый метод, к которому применяете аспект.

Я рекомендую начать с PostSharp.

4
ответ дан 4 December 2019 в 03:38
поделиться

Для простых сценариев аспекта я бы передал тело метода в виде блока универсальному методу, который обрабатывает аспект, то есть реализуя шаблон проектирования «дыра посередине» .

Пример:

public class Class
{
    public void MethodWithoutAspect()
    {
        var dummy = new string('a', 10);

        Console.WriteLine(dummy);
    }

    public void MethodWithAspect()
    {
        Aspect.LogException(() =>
        {
            var dummy = new string('a', 10);

            Console.WriteLine(dummy);
        });
    }
}

public static class Aspect
{
    public static void LogException(Action block)
    {
        try
        {
           block();
        }
        catch (Exception e)
        {
            Log(e);
            throw;
        }
    }

    private static void Log(Exception e)
    {
        throw new NotImplementedException();
    }
}
1
ответ дан 4 December 2019 в 03:38
поделиться

Я использую PostSharp уже довольно долгое время и должен сказать, что мне нравится простота использования и простота реализации.

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

0
ответ дан 4 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: