使用AOP 使C#代码更清晰

时间:2021-09-11 03:02:55

如果你很熟悉面向方面编程(AOP),你就会知道给代码增加“切面”可以使代码更清晰并且具有可维护性。但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作。虽然这些实现方式的好处大于它们的复杂程度,但是我仍然在寻找一种实现AOP的更为简单的方式,来试我的代码更为清晰。我将它们单独移出来,并命名为AspectF。

Aspect Oriented Programming (AOP)的背景

“切面”指的是那些在你写的代码中在项目的不同部分且有相同共性的东西。它可能是你代码中处理异常、记录方法调用、时间处理、重新执行一些方法等等的一些特殊方式。如果你没有使用任何面向切面编程的类库来做这些事情,那么在你的整个项目中将会遗留一些很简单而又重复的代码,它将使你的代码很难维护。例如,在你的业务逻辑层有些方法需要被记录,有些异常需要被处理,有些执行需要计时,数据库操作需要重试等等。所以,也许你会写出下面这样的代码。

[csharp]  

 

 

public bool InsertCustomer(string firstName, string lastName, int age,   

    Dictionary<string, string> attributes)  

{  

    if (string.IsNullOrEmpty(firstName))   

        throw new ApplicationException("first name cannot be empty");  

    if (string.IsNullOrEmpty(lastName))  

        throw new ApplicationException("last name cannot be empty");  

    if (age < 0)  

        throw new ApplicationException("Age must be non-zero");  

    if (null == attributes)  

        throw new ApplicationException("Attributes must not be null");  

      

    // Log customer inserts and time the execution  

    Logger.Writer.WriteLine("Inserting customer data...");  

    DateTime start = DateTime.Now;  

      

    try  

    {  

        CustomerData data = new CustomerData();  

        bool result = data.Insert(firstName, lastName, age, attributes);  

        if (result == true)  

        {  

            Logger.Writer.Write("Successfully inserted customer data in "   

                + (DateTime.Now-start).TotalSeconds + " seconds");  

        }  

        return result;  

    }  

    catch (Exception x)  

    {  

        // Try once more, may be it was a network blip or some temporary downtime  

        try  

        {  

            CustomerData data = new CustomerData();  

            if (result == true)  

            {