C# и AOP - AOPAlliance (Aspect-ориентированное программирование), как это работает

У меня только что был очень интересный опыт работы с AOP на C#. У меня есть функция со списком типов возврата, которая перехватывается, и это все хорошо и хорошо. Однако функция перехвата является функцией стиля валидатора и может предотвратить реальную функцию, вызывая и возвращая булевую ложь.

Так что код выглядит немного так:

List<Update> updates = Manager.ValidateAndCreate();

// protected void Save(List<Update> updates) { ....
Save(updates);

Перехватчик методов выглядит следующим образом

public class ExceptionAdvice : AopAlliance.Intercept.IMethodInterceptor {

    public object Invoke(AopAlliance.Intercept.IMethodInvocation invocation) {

        if (isValid(invocation)) {
            return invocation.Proceed();
        } else {
            return false;
        }
    }

    private bool isValid( ...
 }

Теперь после неудачи валидации значение обновлений на самом деле является булевым, а не списком, я думал, что здесь будет какая-нибудь ошибка во время выполнения, но ее не было, поэтому:

updates.GetType().Name == "Boolean"

Но:

updates is bool == false

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

Как это возможно на таком безопасном языке, как C#? btw it's spring-aop.

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

6
задан Daniel Little 28 August 2011 в 05:35
поделиться