C#记录类

时间:2016-12-22 13:40:29

标签: c# logging unity-container decorator

我正在尝试创建一个简单的记录器,记录另一个类的所有方法调用。这将包括来自同一类中的方法的调用,例如递归调用。

(虽然有"记录传入方法调用观察类"的答案,但我无法找到答案"记录从观察到的类到自身的方法调用&#34 34;如果另一个答案没有解决这个问题,请不要重复关闭)

最简单的解决方案是使用装饰器,如下所示:

class Program
{
    static void Main(string[] args)
    {
        new LoggerDecorator(new Observed()).Do();
    }
}

public class Observed
{
    public void Do()
    {
        Console.WriteLine("Do");
    }
}

public class LoggerDecorator : Observed
{
    private Observed _subject;
    public LoggerDecorator(Observed subject)
    {
        _subject = subject;
    }
    public void Do()
    {
        Console.WriteLine("Log: Start Do");
        _subject.Do();
        Console.WriteLine("Log: End Do");
    }
}

这成功记录了从Main到被观察班级的呼叫。方法:

Log: Start Do
Do
Log: End Do

现在,假设我们添加了一个方法Observed.DoTwice()

public void DoTwice()
{
    Do();
    Do();
}

和相应的记录器:

public void DoTwice()
{
    Console.WriteLine("Log: Start DoTwice");
    _subject.DoTwice();
    Console.WriteLine("Log: End DoTwice");
}

现在我们记录从Main到DoTwice的所有呼叫,但不记录从DoTwice到Do的两个呼叫:

Log: Start DoTwice
Do
Do
Log: End DoTwice

我想要的是这样的:

Log: Start DoTwice
Log: Start Do
Do
Log: End Do
Log: Start Do
Do
Log: End Do
Log: End DoTwice

当然,它不能像这样工作,因为DoTwice调用它自己的 Do方法,而不是装饰器中的重写方法(它甚至不知道装饰器' s存在)。由于装饰器不起作用,我试图用Unity拦截做同样的事情,但它给出了相同的结果。

有谁知道如何实现这一目标?

0 个答案:

没有答案