使用标准 .NET Framework 的 AOP 类属性的基本实现 [重复]

2024-01-02

可能的重复:
C# 通过属性包装方法 https://stackoverflow.com/questions/2206554/c-sharp-wrap-method-via-attributes

我想实现这样的功能:

[Atomic]
public void Foo()
{           
    /* foo logic */
}

Where [Atomic]attribute 是一个属性,它将函数逻辑包装在事务范围内:

using(var scope = new TransactionScope())
{
    /* foo logic */
    scope.Complete();
}

这样的属性怎么写呢?

我之前问过 基本一样question https://stackoverflow.com/questions/14294977/attribute-which-wraps-functionality-of-its-decorated-function-within-some-outer,我知道这可以使用 AOP 来完成,但我没有提到我正在寻找一些最简单的概念实现证明或有用的文章,它们可以帮助我使用纯 .NET Framework 编写此内容(我想使用RealProxy and MarshalByRefObject类型,我已经阅读过浏览相关问题)。

我需要准确地解决这个例子。这似乎是一个基本的事情,所以我想从头开始学习如何做。目前不需要安全和灵活。


这似乎是一个基本的事情...

这是(许多)概念很容易理解,但实现起来却一点也不简单的事情之一。

As per 奥德的回答 https://stackoverflow.com/a/14307335/234, .NET 中的属性则不然做任何事情。它们的存在只是为了让其他代码(或开发人员)稍后可以查看它们。将其视为一个奇特的评论。

考虑到这一点,你可以这样写你的属性

public class AtomicAttribute : Attribute { } 

现在最困难的部分是,您必须编写一些代码来扫描该属性,并更改代码的行为。

鉴于 C# 是一种编译语言,并且考虑到 .NET CLR 的规则,理论上有 3 种方法可以实现此目的

  1. 挂钩 C# 编译器,并使其在看到该属性时输出不同的代码。
    这看起来似乎很好,但这根本不可能 现在。或许是Roslyn http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx项目将来可能允许这样做,但现在你还不能这样做。

  2. 编写一些扫描 .NET 程序集的内容afterC# 编译器已将其转换为 MSIL,并更改 MSIL。
    基本上就是这样后锐利 http://www.sharpcrafters.com/postsharp/features做。扫描并重写MSIL是hard。有一些图书馆,例如莫诺·塞西尔 http://www.mono-project.com/Cecil这会有所帮助,但这仍然是一个非常困难的问题。它还可能会干扰调试器等。

  3. 使用 .NET Profiling API 在程序运行时监视程序,每次看到具有该属性的函数调用时,将其重定向到其他一些包装器函数。
    这也许是最简单的选择(尽管它仍然是非常困难),但缺点是你的程序现在must在分析器下运行。这在您的开发 PC 上可能没问题,但如果您尝试部署它,则会导致一个巨大的问题。此外,使用这种方法可能会对性能造成很大影响。

在我看来,最好的选择是创建一个包装函数来设置事务,然后向其传递一个执行实际工作的 lambda。像这样:

public static class Ext 
{
    public static void Atomic(Action action) 
    {
        using(var scope = new TransactionScope()) 
        {
            action();
            scope.Commit();
        }
    }
}

.....

using static Ext; // as of VS2015

public void Foo()
{
    Atomic(() => {
        // foo logic
    }
}

对此的奇特计算机科学术语是高阶编程 http://en.wikipedia.org/wiki/Higher-order_programming

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用标准 .NET Framework 的 AOP 类属性的基本实现 [重复] 的相关文章

随机推荐