通过DispatchProxy

考虑到许多可能的方法来处理诸如日志记录之类的跨领域问题,我认为通过Interception是解决这些问题的一种好方法。 (另外,马克·西曼(Mark Seemann)在他的《 .NET中的依赖注入》中提到拦截是跨领域依赖的有效解决方案。)

但是在我的特定情况下,我想使用.Net Core,它是DispatchProxy。并记录Microsoft's Logging Extension

使用通用代理拦截方法调用并在Debug level上记录调用非常容易。但是,如何记录方法内部可能发生的拦截器信息日志? 我的想法是在每个需要记录一个空Log()方法的类中实现,该方法接受抽象日志信息作为参数。因此,如果用户需要记录任何信息性信息,则可以调用此方法并提供日志内容。调用此方法时,拦截器可以拦截并根据自变量区别于其他方法。随后,将记录该信息,而调用者无需依赖记录器界面。

我唯一担心的是我可能违反一项原则?还是还有其他需要考虑的东西?

public class Foo 
{    
    public void someMethod()
    {
        // do stuff
        this.Log(new MyLog("Log this information"));
        // do stuff
    }

    private void Log(ILog mylog) { }
}


public Interface ILog
{
    string Message;
    Exception Ex;
    LogLevel level;
    // anything worth logging
}
tb_eleven 回答:通过DispatchProxy

  

但是如何记录方法内部可能发生的拦截器信息日志?

这是不适合拦截(动态拦截和装饰)的方案。在这种情况下,最好的方法是使用构造函数注入将日志记录抽象注入您的类:

public class Foo 
{
    private readonly ILog log;

    public Foo(ILog log) => this.log = log;

    public void someMethod()
    {
        // do stuff
        this.log.Log(new MyLog("Log this information"));
        // do stuff
    }
}

尽管您可以使用可以使用动态代理框架实现的虚拟Log方法来实现此目的,但与仅将Volatile Dependency注入构造函数相比,这增加了更多的复杂性。还要考虑如何测试这些记录调用。仅出于测试目的,您将必须创建组件的派生实现。

但是在将记录器注入消费者之前,请问自己:Do I log too much?

还请注意,.NET中的依赖注入the second edition详细介绍了好的和坏的日志记录策略,并为动态拦截提供了另一种选择(在第10章中)。

本文链接:https://www.f2er.com/3065220.html

大家都在问