我如何使用简单的面向方面的概念来处理没有 postsharp 的异常处理?

How can i use simple aspect oriented concept to handle exception handling without postsharp?

我想使用 AOP 来处理控制台应用程序中的错误异常。 (这不是 MVC,我使用属性花瓶编程来处理 mvc 中的错误,但这是控制台应用程序)我的代码如下:(如果发生错误,它应该抛出一个错误哟我的属性端代码)

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class HandleError : Attribute
{
     public HandleError(string description)
    {
        try
        {
            this.Description = description;
        }
        catch (Exception)
        {

            throw;
        }

    }
    public string Description { get; set; }


}

这将从我的方法中调用:

   [HandleError("Error occurs here")]
    public static void MyMethod(string data)
    {
        throw new Exception();

实际上;我想在我的方法中使用 AOP 来处理异常。如果发生错误,我必须调用属性。但是如何? (请不要提供 postsharp,它需要钱。但我也对开源持开放态度)顺便说一句;为什么不容易,我不明白

基本上,PostSharp 所做的是在编译时将代码编织到您的程序集中,即 运行 在标有属性的方法之前和之后。从性能的角度来看,这是非常好的,因为没有使用在 运行 时间动态创建的代码。

其他一些 AOP 框架(或 IoC 容器)提供了生成动态代理的选项,其中包含在 运行 时间拦截对方法的调用的代码。

您要么使用这些框架之一(寻找 IoC 和拦截),要么您自己实现类似的功能。基本上你要做的就是将你想要拦截的代码移动到一个 class 中并将方法标记为 virtual。在 运行 时,您使用动态创建的 class 装饰 class 的实例,该 class 继承自您的 class 并覆盖方法,因此附加代码为 运行 在调用方法之前和之后。

但是,可能有一种更简单的方法可以满足控制台应用程序的需要。除了使用属性标记方法之外,您还可以创建一些辅助函数,其中包含您希望在方法前后 运行 的代码:

void Main()
{
    int value = GetValue(123);
    DoSomething(value);
}

void DoSomething(int myParam)
{
    RunAndLogError(() => {
        // Place code here
        Console.WriteLine(myParam);
        });
}

int GetValue(int myParam)
{
    return RunAndLogError(() => {
        // Place code here
        return myParam * 2;});
}

void RunAndLogError(Action act)
{
    try
    {
        act();
    }
    catch(Exception ex)
    {
        // Log error
        throw;
    }
}

T RunAndLogError<T>(Func<T> fct)
{
    try
    {
        return fct();
    }
    catch(Exception ex)
    {
        // Log error
        throw;
    }
}

如您所见,RunAndLogError 有两个重载,一个用于 void 方法,另一个用于 return 一个值的方法。

另一种选择是为此目的使用全局异常处理程序;有关详细信息,请参阅此答案:.NET Global exception handler in console application