Pull to refresh

Comments 34

Еще распространенные аспекты — логгирование и проверки безопасности (авторизация). Это так, навскидку, только кода нет с собой.

Это интересно, но, по-моему, большинство аспектов, которые вы показали, крутится у них на сайте в баннерах или есть в прилагаемых samples. Это не так?

Вот еще что не понял: «но ни один их них не «рулит» так как PostSharp». Если говорить про post-processed AOP (instrumentation a la AspectJ), то еще понятно, но ведь существует же и run-time AOP aka «weaving», который PostSharp не умеет, а другие умеют. Имхо, такое высказывание не очень корректно без указания типа AOP-обработки.
Про логгирование я чуть-чуть написал. Что касается проверки безопасности, то у меня у самого была попытка использовать PostSharp для этого в ASP.NET:

internal sealed class AdminOnlyAttribute : OnMethodInvocationAspect
{
  public override void OnInvocation(MethodInvocationEventArgs eventArgs)
  {
    AdminController ac = eventArgs.Instance as AdminController;
    if (ac.Session["Admin"] == null)
      eventArgs.ReturnValue = ac.Index(null);
    else
      eventArgs.Proceed();
  }
}
К сожалению, будучи начинающим в MVC, я не смог заставить этот аспект заработать так, как хотелось бы. Возможно где-то закралась ошибка.

Weaving – это как раз и есть «вплетение» аспекта, будь то во время компиляции или исполнения. Да, PostSharp не умеет добавлять аспекты во время компиляции, но никто не запрещает использовать другие фреймворки параллельно, например в комбинации с IoC контейнерами. Что касается «рулезности» PostSharp, я думал об экспрессивности и «мощи» фреймворков. Здесь я бы выделил следующую иерархию: Макросы (к пр. Nemerle) → Compile-time AOP (PostSharp) → Run-time AOP (PIAB, Spring) → Dynamic programming (e.g., DynamicMethod, Reflection.Emit).

К слову скажу, что помимо простенького weaver’а PostSharp.Laos, в экосистеме PostSharp существует возможность написания своих собственных weaver’ов с помощью PostSharp.Core – и вот тут-то кроется мощь, до которой динамическим и прозрачным прокси никогда не добраться.
>> Про логгирование я чуть-чуть написал
Я имел в виду логгирование в смысле аудита, а у вас — больше трассировка. Впрочем, много общего.

>> PostSharp не умеет добавлять аспекты во время компиляции
Эм, по моим сведениям, как раз во время компиляции он и добавляет (вернее, после, как и AspectJ). А вот в рантайме — не умеет.

А вы .spect не пробовали? Интересно ваше мнение. Мне вот не понравился.
Тьфу, сорри, ошибся. Конечно, PostSharp только при компиляции и добавляет. А про .spect не слышал, надо будет глянуть. Можно ссылочку?
По поводу макросов Немерле.

Эрик Липперт сейчас вовсю переписывает компилятор c# на c#. Скорее всего, это серьезно намекает на то, что в 5ом FW имеет хорошие шансы появиться compiler as a service, и, как следствие, AST-трансформеры.
Да, стараются там, думаю будет неплохо, хотя мне и Nemerle нравится. Надо будет тут на Хабре его развить, хотя бы макросную часть, а то блог че-то слабоват пока.
простите, но, о чем это все?
може легкий экскурс в AOP?
У меня есть вебкаст (где-то 50 минут) который рассказывает что такое АОР, какие есть фреймворки, как они работают.
Напишите статейку на Хабр — будет интересно почитать. Я сам с ним почти не работал.
Спасибо огромное за вебкаст и статью, начал с них изучение AOP, оч понравился подход.
Если будут вопросы в процессе изучения можно к вам обратиться? Я не назойливый, правда =)
Пожалуйста, обращайтесь. =)
Спасибо огромное =)
Кстати, вы не пробовали Unity? Наткнулся вот на него.
Ха, вы наверное шутите :) знаю и использую.
=) как я понимаю его вместе с PostSharp использовать можно?
Да, его можно использовать с PostSharp в том смысле что можно использовать контейнер внутри аспекта. Что же касается применения типа того, что у вас по ссылке, то с PostSharp подобные вещи не пройдут потому как все решения относительно применения аспектов происходят на этапе компиляции. Это значит что PostSharp не поможет при конфигурируемом применении аспектов (например через XML-файл) если только вы сами не начнете пробрасывать какие-нибудь флаги через аспекты – что само по себе не очень хорошо.

С другой стороны, можно продолжать использовать Unity для dependency resolution:

class Animals
{
  [LazyLoad(typeof(Dragon))] // вызовет My.IoCContainer.Resolve<IDragon>()
  public Dragon myDragon;
}
Также можно использовать Unity и для тех же целей, для которых используется PIAB и прочие proxy-based фреймворки:

class Animals
{
  [LazyLoad(typeof(IBird), typeof(ILizard)] // создаст копию класса Dragon, реализующую
  public Dragon myDragon;                   // множественное наследование от классов Bird и Lizard :)
}
Спасибо, извините что так много вопросов, тема для меня новая =) Буду дальше сам разбираться.
Никогда не сталкивался с АОП, потому возник такой вопрос.
Часто приходится писать свойства которые должны инициализироваться единожды при обращении к ним.
Например
public SomeClass _classInstance;
public SomeClass ClassInstance
{
get{
if(_classInstance == null)
_classInstance = new ClassInstance;
return _classInstance;
}
}

Позволит ли AOП решить эту задачу одним аттрибутом?
ЧТо-нить вроде
[InitOnce]
public SomeClass ClassInstance{get;set;}

Или даже вот так
[InitOnce(el => new SomeClass(parameter)]
public SomeClass ClassInstance{get;set;}
LazyLoad в статье же показано или я что-то не так понимаю?
Точно… гоню… спать надо ((
UFO just landed and posted this here
Версия 1.0 жутко тормозила компиляцию – настолько что о непрервыной интеграции можно забыть. Что касается времени исполнения, оно уменьшается только на тот инфраструктурный код, который вплетает аспект. Уверяю вас, его там самый минимум. Впрочем, вы сами можете открыть скомпилированную сборку Рефлектором и посмотреть.

Да, есть например такой, достаточно простенький, пример. Сам я PostSharp для транзакций не использовал, поэтому наработок у меня нет.

[Serializable]
public class TransactedAttribute : OnMethodInvocationAspect
{
  public override void OnInvocation(MethodInvocationEventArgs eventArgs)
  {
    using (var t = new TransactionScope())
    {
      eventArgs.Proceed();
      t.Complete();
    }
  }
}
Супер — намонстрячили кучу классов-аспектов. А как же все это дело заюзать — нипаняяяяяяяяяяяяяяятна
В принципе в моем вебкасте показаны некоторые из этих аспектов, и как их применять. Обычно это очень просто – пишем какой-то аттрибут перед методом или свойством или классом, или даже глобально (в AssemblyInfo.cs). И все. PostSharp сам реализует аспекты в наших классах. Вот пример:

[NotifyPropertyChanged]
public class Settings
{
  public string Name { get; set; }
  public int Age { get; set; }
}
 

 
// класс Settings магическим способом реализовал INotifyPropertyChanged
Settings s = new Settings();
INotifyPropertyChanged npc = (INotifyPropertyChanged)(object)s; // опа!
Сори за брюзжание. Собственно, механизм связывания непонятен. Как постшарп интегрируется в приложение? Что нужно добавить, какие свойства прописать? Как это работает?:) Конечно, можно полезть на сайт и все выяснить, но вы же взялись статью писать, да?:)
UFO just landed and posted this here
При компиляции. Собственно в этом и есть приемущество PostSharp перед другими фреймворками. По сути дела он просто переписывает сборку, добавляя в нужные места ссылки на аспекты (именно ссылки, аспект ≠ макрос). Сами аспекты сидят рядом в сборке и ждут пока из вызовут.
UFO just landed and posted this here
Вы не знаете как добавить атрибут к методу или классу? Обязательно посмотрите вебкаст, сслка на который естьв статье, все понятно станет.
Сенкс за совет. Зачем статью писали, если все в вебкасте есть?
Ну там не совсем все и тут можно у автора что-то спросить Вообщем мне и статья и вебкаст показались оч полезными, много нового узнал.
Sign up to leave a comment.

Articles