.Net 核心 3:Microsoft.Extensions.Logging.Internal 中不存在命名空间 internal

Yah*_*ein 10 c# .net-core .net-core-3.0

我有一个使用Microsoft.Extensions.Logging.Internal命名空间的 .Net core 2.1 项目,特别是FormattedLogValues类。

我现在正在迁移到 .Net core 3,我找不到关于FormattedLogValues移动到哪里或其替代品的文档。

甚至删除了命名空间文档

有小费吗?

Nod*_*.JS 11

我通过更新moq到“4.13.1”并利用It.IsAnyType.

_logger.Verify(f => f.Log(
    It.IsAny<LogLevel>(),
    It.IsAny<EventId>(),
    It.IsAny<It.IsAnyType>(),
    It.IsAny<Exception>(),
    (Func<It.IsAnyType, Exception, string>) It.IsAny<object>()));
Run Code Online (Sandbox Code Playgroud)

  • 这个问题与最小起订量有什么关系?这个答案与所提出的问题有什么关系? (7认同)
  • 人们将您的问题与 Moq 相关联的原因可能是因为他们试图以严格的模拟行为来 Moq ILogger,从而强制创建其中包含 FormattedLogValues 的特定 Log 签名,这反过来又限制了访问。同样适用于 Rhino 严格模式 (2认同)

Mar*_*ies 6

这实际上取决于您对类型所做的操作,但是查看github 源中的代码,它看起来该类型仍然存在,但是是内部的 - 这意味着只有库本身才能实际访问该类型,除非您已经得到了程序集InternalsVisibleTo("")- 但我们现在将忽略它。

所以类型本身是一个有点奇怪的实现,IReadOnlyList<KeyValuePair<string, object>>但这意味着如果你正在测试进入记录器的值,你可以像这样访问:

logger.State[0][0].Value

此处的“状态”是库中定义的内容,因此希望对术语很熟悉。

如果您使用的是 Moq 或等效项,您可能可以使用:

_logger.Verify(f => f.Log(
    It.IsAny<LogLevel>(),
    It.IsAny<EventId>(),
    It.IsAny<IReadOnlyList<KeyValuePair<string, object>>>(),
    It.IsAny<Exception>(),
    (Func<It.IsAnyType, Exception, string>) It.IsAny<object>()));
Run Code Online (Sandbox Code Playgroud)

如果要在自己的记录器中使用它,则必须创建自己的继承自该类的类:

public class MyLogValues : IReadOnlyList<KeyValuePair<string, object>> {}
Run Code Online (Sandbox Code Playgroud)

然后两个类都可以简化为接口

希望这会有所帮助,我认为这取决于您将类型用于.