面向方面的编程框架
对于深潜,你可以阅读马修D.格罗夫斯AOP in .NET: Pracitical Aspect-Oriented Programming。
否则,主管postsharp,Gael Fraiteur,不时在SO上,所以他也可能会在这里弹出。
在它的核心AOP是关于从你的主要逻辑中分离'交叉切割问题'。诸如日志记录,事务管理等等在整个应用程序中使用,但代码不是特定于给定的类,而是被重复使用。 AOP允许您将这些代码从您的课程中解脱出来并粘贴到其他地方。
从https://blog.safaribooksonline.com/2013/07/17/why-you-should-be-using-aspect-oriented-programming/:
}
日志代码无关与Reverse
和杂波了实际获取完成工作的代码。 AOP允许你的代码移动到一个单独的地方:
public class StringReverser : IStringReverser
{
[LoggingAspect]
public string Reverse(string text)
{
if (text == null)
return null;
return new string(text.Reverse().ToArray());
}
}
而且日志代码:
[Serializable]
public class LoggingAspect : MethodInterceptionAspect
{
IMyLogger _log;
public override void RuntimeInitialize(MethodBase method)
{
_log = MyServiceLocator.Get();
}
public override void OnInvoke(MethodInterceptionArgs args)
{
var methodName = args.Method.Name;
var parameters = args.Method.GetParameters();
_log.WriteLine(string.Format("{0} timestamp: {1}", methodName,
DateTime.Now));
for (var i = 0; i < args.Arguments.Count; i++)
_log.WriteLine(string.Format("{0} argument #{1}, {2} ({3}): {4}",
methodName,
i,
parameters[i].Name,
parameters[i].ParameterType,
args.Arguments[i]));
args.Proceed();
_log.WriteLine(string.Format("{0} return value: {1}", methodName,
args.ReturnValue));
}
}
谢谢,我读了这本书并理解了这个概念。我只是试图向某人辩护。我被告知你可以自己手动做 - 我确信我可以 - 但我认为postharp等提高了生产力。如果我理解正确,我想MethodInterceptionAspect是postsharp提供的开箱即用功能。 – cs0815 2014-10-02 11:43:25
您无法真正手动执行AOP。您需要一个框架将“方面”编织到代码中。我想你可以把你们的跨学科问题分成静态实用课程,并且这样做,但是你会失去很多。这有点像DIY DI与DI框架。你可以自己做依赖注入,但是对于框架来说它更好。 – 2014-10-02 11:54:50
这个想法是,如果你有1000个业务方法或其他什么,并且他们需要登录,你可以将日志方面/建议应用到你的业务方法中。如何完成日志记录,包含哪些参数等等,你只需要更新一个方面。如果你使用“glue-code”手动执行,你将不得不更新1000个呼叫站点。 对于AOP来说,日志记录可能是最天真的用例,当你将撤消/重做应用到对象或者脏跟踪到实体等。 – 2014-10-02 11:57:14
这样可以节省时间并执行适当的设计。但我敢打赌,你已经在你发布的链接上阅读了这篇文章。 – Madmenyo 2014-10-02 11:30:31
是的。然而,我必须证明框架的合理性,而不是手动进行,你可以。我主要的观点是生产力。我只是想检查是否还有其他我忽略的东西。 – cs0815 2014-10-02 11:45:03