Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
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, я не смог заставить этот аспект заработать так, как хотелось бы. Возможно где-то закралась ошибка.DynamicMethod
, Reflection.Emit
).PostSharp.Laos
, в экосистеме PostSharp существует возможность написания своих собственных weaver’ов с помощью PostSharp.Core
– и вот тут-то кроется мощь, до которой динамическим и прозрачным прокси никогда не добраться.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; } }
[InitOnce] public SomeClass ClassInstance{get;set;} Или даже вот так [InitOnce(el => new SomeClass(parameter)] public SomeClass ClassInstance{get;set;}
[Serializable]
public class TransactedAttribute : OnMethodInvocationAspect
{
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
using (var t = new TransactionScope())
{
eventArgs.Proceed();
t.Complete();
}
}
}
[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; // опа!
Несколько полезных аспектов для PostSharp