【问题标题】:Where logging should go in onion architecture with DDDDDD 的洋葱架构中的日志记录应该放在哪里
【发布时间】:2015-02-23 13:57:59
【问题描述】:

我正在使用洋葱架构和域驱动设计开发控制台应用程序。我有两个域,我需要在其中实现日志记录,我很困惑我可以在哪里放置日志记录组件。我可以把它放在两个域的各自基础设施中吗?或者在可以在两个域中引用的共享内核中?如果我需要将它放在共享内核中,我应该遵循什么结构?我的意思是像核心、基础设施。

【问题讨论】:

    标签: domain-driven-design onion-architecture


    【解决方案1】:

    日志记录是一个跨领域的关注点。面向方面的编程旨在将横​​切关注点封装到方面。这允许对解决横切关注点的代码进行干净的隔离和重用。

    您需要创建一个库并实现您的日志记录类,例如“MyProject.CrossCutting.Logging”,并使用面向方面的方法使用此库记录事件。

    【讨论】:

    • 听起来不错,但这通常意味着有一个集中式日志,但是如果您想为聚合保存事件怎么办 - 它们可能具有相同的结构,但它们应该被封装(可访问仅通过聚合根),那么如果我每个聚合都有事件 - 比如 SalesEvent、CustomerEvent。那么根据 DDD,处理这些事件应该是 Aggregate root 的责任,不是吗?或者也许它仍然意味着记录器位于infrasture 并且聚合根将其称为“保存我的事件”,但是记录器将如何解决存储位置?
    • @Prokurors 恕我直言,日志必须尽快以统一的方式从整个应用程序中发出 - 因为日志用于调试,如果在发出日志之前应用程序以意外方式崩溃,它们将是丢失。因此,每个应用程序都有一个集中式日志是最有意义的。如果需要,日志可以在以后根据在应用程序之外工作的日志处理器的标签进行分散。事件不同于日志。只有在聚合成功提交到数据库后,存储库才能发出事件,如果预期提交失败,则丢弃它们。
    【解决方案2】:

    如果您遵循 DDD 和洋葱架构,那么您拥有多少域并不重要。如果需要,每个域都可以实现自己的 Logger 版本。很可能,您将创建一个日志接口,并且可能会创建一个静态实现,该实现保存在通用层中,可以由任何需要它的层调用。在之前共享的图像中,它将保留在横切层中。如前所述,日志记录是所有层的关注点。

    【讨论】:

    • 根据前面的建议,我们所做的是,我们在核心中创建了一个记录器接口,并在共享内核中创建了具体实现,我们将这个具体实现从使用核心服务的主程序注入核心.我的方向正确吗?
    • @MaheshkumarCh 日志记录不是域问题。它不应该在任何域模型中,无论是共享内核还是独立域。
    • 那么日志记录应该去哪里?我正在使用洋葱架构。我正在使用登录服务来记录所有操作。
    • 在 UI(控制台、ASP.NET Core 等)中设置日志记录,然后注入到基础架构中。
    • 那么,作为一个纯粹的基础设施服务,Logger的接口和实现会不会在基础设施层定义呢?
    【解决方案3】:

    日志记录贯穿您的所有应用程序。这应该是你框架的一部分。所有应用程序项目的所有层都可以依赖于您的框架,就像它们依赖于 .Net Framework、Spring 等一样。您的框架必须具有您可以轻松依赖的横切关注点的抽象,并且然后只需在基础设施中的应用程序的组合根目录中引用实现即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2011-03-24
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多