面向方面的编程示例

Dav*_*ier 45 aop

任何人都可以发布一个没有记录的面向方面编程(AOP)的例子吗?

我查看了几个资源,但所有示例都是简单的日志记录.它有用的是什么?

Ble*_*dof 33

其中一个例子是直接从这个面向方面的程序设计:模块化的激进研究,Youtube视频绘制到显示器.在示例中,您有一个绘图程序,它由点,形状等组成,当发生对这些对象的更改时,您需要告诉显示器更新自身.如果不在一个方面处理它,你最终会重复自己.

正如我所理解的那样,AOP的创建是为了不重复自己的交叉问题,这可能与业务逻辑无关.通过各方面,您可以将这些问题模块化到方面.其中一个例子是记录,但是你可能最终会重复一些不同的事情.它一直在发展,它不再是面向方面的编程,而是面向方面的建模.

有关面向方面编程的更多信息可以从以下来源中找到:

  • @Pacerier:您的陈述是错误的.我多年来一直在使用AOP以避免*错误并简化重构和调试.OOP中的所有交叉代码都与整个代码库纠缠在一起,整齐地模块化,因此很容易在AOP中进行本地化.核心代码易于阅读和维护.像你这样的陈述大多是从那些没有掌握AOP概念并且没有广泛使用它的人那里听到的(除了给予快速尝试,这是不够的). (3认同)

And*_*sen 11

安全

  • 注入检查权限和阻止访问的代码

asp.net webcontrols/webparts的友情错误消息

性能

  • 注入设置perf计数器的代码,以便概览应用程序运行缓慢的位置


Pac*_*aco 6

验证:

[NotNull]
public string Property1 { get; set; }

[Length(Min = 10, Max = 20)]
public string Property2 { get; set; }

[Regex(Expression = @"[abc]{2}")]
public string Property3 { get; set; }
Run Code Online (Sandbox Code Playgroud)


nam*_*los 6

撤消 - 我正在调用支持撤消操作的第三方程序集.它要求调用者创建撤消上下文,调用程序集中的某些方法,然后销毁撤消上下文.上下文可以嵌套.此外,如果创建了上下文但仍处于需要重新启动应用程序的不良状态.

通常使用undo我会写这样的东西

    void foo()
    {
        int id = lib.create_undo_context();
        try
        {
            lib.performsomeaction();
            lib.performsomeaction();
            lib.performsomeaction();

        }
        finally
        {
            lib.destroy_undo_context(id);
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用PostSharp我定义了一个名为[Undo]的属性,该属性在方法启动时创建撤销上下文,并在方法退出时销毁它(即使抛出异常) - 所以代码看起来像这样

    [Undo]
    void foo()
    {
        lib.performsomeaction();
        lib.performsomeaction();
        lib.performsomeaction();
    }
Run Code Online (Sandbox Code Playgroud)

实现这个比我展示的要复杂一点,因为即使在存在嵌套撤销上下文的情况下,我也确保清除所有撤消上下文 - 但是你明白了.


ori*_*rip 5

另一个经典示例(如日志记录)是缓存。但其他例子更有趣。


小智 5

依赖注入

严格来说,依赖注入只不过是一个横切关注点。许多依赖注入框架使用基于属性的编程风格,如下所示:

public class Car:IDisposable
{
    [Inject]
    public IGearBox Gearbox { get; set; }
   ...
}
Run Code Online (Sandbox Code Playgroud)

[Inject] 属性也可以设计为一个方面,而不依赖于外部框架。