在 C++ 中,没有事实上的标准日志记录工具。以我的经验,商店自己经营。然而,当试图创建可重用的软件组件时,这会产生一些问题。如果您系统中的所有内容都依赖于日志组件,这会降低软件的可重用性,基本上会迫使任何下游项目将您的日志框架与他们真正想要的组件一起使用。
IOC(依赖注入)并不能真正解决这个问题,因为您的组件需要依赖于日志抽象。日志组件本身可以添加对文件 I/O、触发机制和其他可能不需要的依赖项的依赖项。
向您的专有日志记录框架添加依赖项是否会牺牲组件的可重用性?
在 C++ 中,没有事实上的标准日志记录工具。以我的经验,商店自己经营。然而,当试图创建可重用的软件组件时,这会产生一些问题。如果您系统中的所有内容都依赖于日志组件,这会降低软件的可重用性,基本上会迫使任何下游项目将您的日志框架与他们真正想要的组件一起使用。
IOC(依赖注入)并不能真正解决这个问题,因为您的组件需要依赖于日志抽象。日志组件本身可以添加对文件 I/O、触发机制和其他可能不需要的依赖项的依赖项。
向您的专有日志记录框架添加依赖项是否会牺牲组件的可重用性?
是的。但是在这种情况下,依赖注入会有所帮助。
您可以创建一个抽象日志记录基类并为您要使用的日志记录框架创建实现。您的组件仅依赖于抽象基类。并且您根据需要注入实现及其所有依赖项。
是的,门德尔特是对的。我们的产品正是这样做的。一切都依赖于 ILogger 抽象接口,但它不依赖于其他任何东西。通常,可执行文件或高级 DLL 将是构建实际实现的 Logger 接口并注入它的那个。
如果您正在寻找构建不会重新编译的库,但想提供一个日志接口,那么也许一个好方法是允许(库的)用户提供回调。
在使用您的库初始化日志记录时,他们需要指定回调,然后胶水代码由他们决定,以使其与他们拥有的任何东西都能很好地配合使用。
如果您可以使回调的签名看起来像他们可能始终可用的标准函数,那么如果他们实际上没有记录器,它会为他们提供一个简单的默认选项。
此外,调用者可能多次从库中实例化组件,并且对于资源争用或线程问题,希望为每个组件提供不同的记录器回调。