可能有效使用单身人士?

Moo*_*ice 5 c# design-patterns servicestack

我已经到了设计的重点,我正在认真考虑单身人士.

众所周知,"常见"的论点是"永远不要做!这太糟糕了!",好像我们用一堆goto语句把我们的代码搞得一团糟.

ServiceStack是一个很棒的框架.我自己和我的团队都在其上销售,我们有一个复杂的基于Web服务的基础设施来实现.我一直鼓励异步设计,并在可能的情况下 - SendAsync在服务堆栈客户端上使用.

鉴于我们所有这些不同的系统都在做不同的事情,我想要有一个共同的记录器,(实际上是一个Web服务,如果Web服务不可用,则会回退到本地文本文件) - 例如,一些恶魔正在跟踪建筑物).虽然我是依赖注入的忠实粉丝,但对于每个异步请求传递对"使用此记录器客户端"的引用似乎并不干净(至少对我而言).

鉴于ServiceStack的失败签名是一个Func<TRESPONSE, Exception>(我对此没有任何错误),我甚至不确定如果首先进行调用的封闭方法将具有有效句柄.

但是,如果我们此时有一个单例记录器,那么我们在世界的哪个位置,我们所处的线程以及我们所处的无数匿名函数的哪一部分并不重要.

这是一个被接受的有效案例,还是一个非争论的单身人士?

myt*_*thz 3

日志记录是单例有意义的领域之一,它永远不会对您的代码产生任何副作用,并且您几乎总是希望全局使用相同的记录器。使用单例时您应该关心的主要问题是线程安全,对于大多数记录器来说,它们默认是线程安全的。

ServiceStack 的日志记录 API允许您通过在 App_Start 上进行全局配置来提供可替代的日志记录实现:

LogManager.LogFactory = new Log4NetFactory(configureLog4Net:true);
Run Code Online (Sandbox Code Playgroud)

之后,每个类现在都可以访问上面工厂中定义的 Log4Net 记录器:

class Any
{
    static ILog log = LogManager.GetLogger(typeof(Any));
}
Run Code Online (Sandbox Code Playgroud)

在所有测试项目中,我更喜欢将所有内容记录到控制台,因此我只需使用以下命令设置一次:

LogManager.LogFactory = new ConsoleLogFactory();
Run Code Online (Sandbox Code Playgroud)

默认情况下,ServiceStack.Logging 将日志记录到良性 NullLogger,该 NullLogger 会忽略每个日志条目。