Mic*_*ner 2 c# architecture logging
这更像是一个架构问题:您是使用 ILogger(并通过 DI 在构造函数中传递它)还是更喜欢静态类 Log?
我们经常使用 ILogger,但它似乎确实使代码变得混乱,尤其是当它通过构造函数传递时。如果不是通过构造函数传递并且只是每次创建,那么我真的看不到使用接口的好处。
那么你如何处理呢?我对它背后的论点特别感兴趣——不仅仅是说“静态”或“界面”。
谢谢
出于不同的原因,使用任何事物的静态实例都是一个坏主意,具体取决于您的用例。
- 它们很难在单元测试中模拟,因此即使不需要它们,您的记录器也始终在编写日志。
- 缺乏模拟也意味着您无法编写测试来确保在适当的情况下编写错误日志。- 它们不能在运行时替换以允许注入不同的记录器。如果您要发布一个库供其他人使用,这可能很重要。我定义了一个标准的记录器接口并将所有内容记录到其中,然后允许客户端注入他们自己的记录器,只要它实现了我的接口。
- 如果您使用供应商提供的默认静态 Log 实现,您将被锁定在他们的界面中,这意味着您无法隐藏或更改记录器的表面积。如果新记录器的语法发生变化,则更改记录器将变得更加困难。
所以这给你留下了某种注射。我个人更喜欢在构造函数中包含所有依赖项,即使它变得冗长,因为很容易看到特定类具有的所有依赖项。如果您试图避免使用大型构造函数,您可以查看属性注入。这需要类的属性上的属性,但仍然为您提供注入依赖项的所有优点。如果您将注入的属性放在基类上,它将自动对所有子类可用。
顺便说一句,我不是上面描述的环境上下文的粉丝,因为它基本上是一个单一用途的 DI 容器,并且您必须具体引用多个环境服务容器。如果您对这种模式的轻松访问感兴趣,请查看 Service Location,它的想法相同但更灵活。
| 归档时间: |
|
| 查看次数: |
1572 次 |
| 最近记录: |