2009-08-20 4 views
0

В основном я пытаюсь реализовать какое-то аспектно-ориентированное программирование бедных людей на C#. Я думал об использовании ContextAttribute, но они кажутся только связанными на уровне класса. Есть ли способ, которым я могу поместить атрибут таким образом, чтобы он получал те же параметры, что и метод, который он комментирует, или каким-то образом доступ к контексту, в котором он запускался?Получение контекста атрибута в C#

У меня есть этот код

public void AddUser(User user) 
{ 
    var errors = DataAnnotationsValidationRunner.GetErrors(user); 
    if (errors.Any()) 
      throw new RulesException(errors); 
    users.Add(user); 
} 

, из которого я хотел бы извлечь первые 3 строки, так что я должен был что-то вроде

[Validated] 
public void AddUser(User user) 
{ 
    users.Add(user); 
} 

ответ

2

Я думаю, что вам не хватает третьего компонента. Большинство реализаций AOP (например, Aspect#) полагаются на прокси-сервер или перехватчик для фактического выполнения кода. В вашем сценарии вам не хватает какого бы то ни было компонента, который должен был: 1) знать, что атрибут существует в методе, и 2) запустить механизм (или стать им), необходимый для выполнения кода внутри атрибута.

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

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

+0

+1 для PostSharp –

+0

Это идеальный вариант, я не понимал, что для C# был аспект ткача, который где-то читал, что это невозможно. Я думаю, что postharp выходит из http://zombo.com, где невозможно невозможно. – stimms

+0

Просто FYI, посмотрите на плагины, которые поставляются с Postsharp. Я знаю, что log4postsharp (который выходит замуж за log4net и postsharp) приходит с атрибутом Log [], который будет записывать вход/выход в метод (включая отображение всех параметров, переданных в (и их значений!)). Вы можете просто переписать этот код, чтобы выполнить любую проверку. Это определенно сэкономит вам время ... –

1

Не знаю точно, как ваше решение должно выглядеть, но в атрибутах C# не выполняется код, если вы не запрашиваете их (насколько я знаю). И если вы запрашиваете атрибут, у вас также есть контекст. На мой взгляд, что-то не так с вашей стратегией.

Смежные вопросы