我理解面向对象的编程,并且已经编写了OO程序很长一段时间.人们似乎在谈论面向方面的编程,但我从未真正了解它是什么或如何使用它.什么是基本范式?
这个问题是相关的,但并没有提出这个问题:
像这里和整个世界的大多数开发人员一样,我多年来一直在使用面向对象编程(OOP)技术开发软件系统.因此,当我读到面向方面编程(AOP)解决传统OOP无法完全或直接解决的许多问题时,我会停下来思考,这是真的吗?
我已经阅读了很多信息,试图学习这个AOP范例的关键,并且我在同一个地方,所以,我想更好地理解它在现实世界应用程序开发中的好处.
有人有答案吗?
对于给定的类,我希望有跟踪功能,即我想记录每个方法调用(方法签名和实际参数值)和每个方法退出(只是方法签名).
我如何做到这一点假设:
为了使问题更具体,让我们假设有3个类:
public class Caller
{
public static void Call()
{
Traced traced = new Traced();
traced.Method1();
traced.Method2();
}
}
public class Traced
{
public void Method1(String name, Int32 value) { }
public void Method2(Object object) { }
}
public class Logger
{
public static void LogStart(MethodInfo method, Object[] parameterValues);
public static void LogEnd(MethodInfo method);
}
Run Code Online (Sandbox Code Playgroud)
如何调用Logger.LogStart和Logger.LogEnd每次调用方法1和方法2,而无需修改Caller.Call方法,没有明确地加入调用Traced.Method1和Traced.Method2?
编辑:如果我允许稍微更改Call方法,会有什么解决方案?
我想监视具有指定注释的所有类的所有公共方法(比如@Monitor)(注意:注释在类级别).什么可能是一个可能的切入点?注意:我使用的是@AspectJ样式的Spring AOP.
什么是一个很好的例子cross-cutting concern
?维基百科页面上的医疗记录示例对我来说似乎不完整.
特别是从这个例子中,为什么日志记录会导致代码重复(散射)?(除了简单的呼叫,如log("....")
无处不在,这似乎不是什么大不了的事).
a core concern
和a有cross-cutting concern
什么区别?
我的最终目标是更好地了解AOP.
我总是使用Repository模式但是对于我的最新项目,我想看看我是否可以完善它的使用和我的"工作单元"的实现.我开始挖的越多,我开始问自己一个问题:"我真的需要它吗?"
现在这一切都从Stackoverflow上的一些评论开始,跟踪Ayende Rahien在他的博客上的帖子,其中有2个具体,
这可能是永远和永远讨论的,它取决于不同的应用程序.我想知道什么
使用扩展方法很容易做到这一点.干净,简单,可重复使用.
public static IEnumerable GetAll(
this ISession instance, Expression<Func<T, bool>> where) where T : class
{
return instance.QueryOver().Where(where).List();
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法和Ninject
DI,我是否需要创建Context
一个接口并将其注入我的控制器?
architecture aop design-patterns entity-framework repository-pattern
在C#,VB.net中有很多AOP实现.这是一些AOP实现:
.Net中AOP的最佳实现是什么?我应该用什么?
我正在学习面向方面的编程概念和Spring AOP.我无法理解Pointcut和Joinpoint之间的区别 - 它们对我来说似乎都是一样的.Pointcut是您应用建议的地方,Joinpoint也是我们可以应用我们建议的地方.那有什么区别?
切入点的一个例子可以是:
@Pointcut("execution(* * getName()")
Run Code Online (Sandbox Code Playgroud)
什么是Joinpoint的例子?
在一篇名为"AOP Fundamentals"的文章中,我要求King的英文解释AOP是什么,以及它做了什么.我收到了一些非常有用的答案和链接到文章,这些文章帮助我了解了所有理论.
但是现在AOP得到了我的全部关注,所有这些文章和章节摘录都很棒,但在每一个案例中,它们都包含了崇高的理论,模糊的UML模型,以及抽象的顺序,这些都是我喜欢的.
这是我对AOP理论的理解,只是为了澄清,所以如果你看到一些看起来不对的东西,请告诉我!
诸如日志记录,身份验证,同步,验证,异常处理等交叉问题在非AOP系统中变得高度耦合,因为它们几乎被代码库中的每个组件/模块使用.
AOP定义了使用连接点,建议和切入点来抽象这些横切关注点的方面(类/方法).
一个.建议 - 实现跨领域关注(即进行实际记录,验证,验证等)的实际代码(方面的方法,可能?)
湾 加入点 - 在非AOP代码中触发的事件,导致特定方面的建议被执行("编织"到非AOP代码中)
C.切入点 - 基本上是连接点(触发事件)到建议执行的映射
所有方面都模块化(LoggingAspect,AuthenticationAspect,ValidationAspect等)到组件中并使用AspectWeaver注册.当非AOP/POJO代码遇到连接点时,AspectWeaver会围绕非AOP代码"编织"(集成)映射的建议:
public class LoggingAspect { // ... public void log(String msg) { ... } } public class ExceptionHandlingAspect { // .. public void handle(Exception exc) { ... } } public class NonAOPCode { // ... @LoggingAspect @ExceptionHandlingAspect public void foo() { // do some stuff... …
aop ×10
java ×3
aspectj ×2
paradigms ×2
spring-aop ×2
.net ×1
architecture ×1
c# ×1
exception ×1
oop ×1
pointcut ×1
reflection ×1
spring ×1