首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「首席看软件架构」DDD,六边形,洋葱的,干净的,CQRS的整合架构

这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章。在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识。如果您阅读了本系列以前的文章,那么本文的内容可能更有意义。...如果在某个时候我们决定改变数据库供应商,比如PostgreSQL或MongoDB,我们只需要创建一个新的适配器来实现PostgreSQL特定的持久化接口,并注入新的适配器而不是旧的。...[编辑- 2017-11-18]我完全错过了我用来从查询返回数据的DTO,所以我现在添加了它。感谢MorphineAdministered公司为我指出了这一点。 ?...然而,这并不总是需要的,事实上在大多数情况下,处理程序将包含用例的所有逻辑。如果需要在另一个处理程序中重用相同的逻辑,则只需要将逻辑从处理程序提取到单独的应用程序服务中。...[编辑- 2017-11-18]我完全错过了我用来从查询返回数据的DTO,所以我现在添加了它。感谢MorphineAdministered公司为我指出了这一点。 ?

5.2K22

Java 异常|Java Exceptions

本文是对以下内容的分析:Java异常设计,Java异常可以告诉什么,以及如何使用Java异常。 Java Exceptions Java Exception 是为处理异常应用程序行为而创建的类。...Java 中的异常处理 有两种方法可以处理抛出的异常:在当前方法中处理它或者只是重新抛出它。没有比这更好的方法了。您可能有一个父处理程序或以某种方式处理它,例如制作重试逻辑。  ...提供的例外可能是彼此的父级,但是,在这里,我只列出最流行的案例,而不管它们的关系如何:  潜在原因原因的可能性有多大怎么修需要重写代码吗?需要重启吗?...空指针异常预期的不可为空的对象为空高的调用前添加验证层是的是的某些资源不可用并返回空数据中等的调用前添加验证层是的是的并发修改异常迭代期间集合已更改高的分别进行集合迭代和修改是的是的 集合在迭代期间已从另一个线程更改高的为集合添加同步是的是的非法参数异常传递的参数无效高的在传递参数之前添加验证是的是的数字格式异常传递的参数格式错误或符号错误高的在传递数据之前添加格式或删除不可见符号是的是的...就个人而言,我更喜欢使用运行时异常。即使在设计库的情况下,您仍然可以在方法签名中保留运行时异常,并在 API 中添加一些注释。在这种情况下,您的 API 用户将能够决定如何处理它。

3.2K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    API漂移的浪潮:使用模拟来保持漂浮

    开发人员能够控制模拟API的各种组件,例如: 数据结构: 定义预期的响应结构。 响应类型: 确保模拟答案符合文档中指定的类型。 错误处理: 配置如何返回错误以表示可能的API故障场景。...它确保每个人都从相同的基准出发,并知道预期结果是什么。 前端团队使用API模拟生成的数据来创建和测试接口,验证数据格式并确保应用程序逻辑与预期回复匹配。...这对于开发一个健壮且响应迅速的界面至关重要,该界面可以优雅地处理成功和错误的答案,从而降低集成实际API时出现意外问题的可能性。...部署: 在受控环境中实施更改的过程,这通常从登台阶段开始,然后才能全面投入生产。 通过遵循这些流程,变更管理降低了API相关应用程序和服务意外中断的可能性。...例如,如果实际实现与声明的响应结构不同,开发人员可能会发布一个更改,认为它是向后兼容的,但客户端却会遇到集成中断的情况。

    7010

    「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构,CQRS的整合架构

    这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章。在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识。如果您阅读了本系列以前的文章,那么本文的内容可能更有意义。...辅助或被驱动适配器 与围绕端口的被驱动适配器不同,驱动适配器实现一个端口和一个接口,然后将其注入到应用程序核心中,无论哪里需要端口(类型暗示)。 例如,假设我们有一个需要持久化数据的简单应用程序。...如果在某个时候我们决定改变数据库供应商,比如PostgreSQL或MongoDB,我们只需要创建一个新的适配器来实现PostgreSQL特定的持久化接口,并注入新的适配器而不是旧的。...查询对象将包含一个优化的查询,该查询将简单地返回一些原始数据以显示给用户。该数据将以DTO的形式返回,并注入到ViewModel中。这个视图模型可能有一些视图逻辑,它将被用来填充一个视图。...然而,这并不总是需要的,事实上在大多数情况下,处理程序将包含用例的所有逻辑。如果需要在另一个处理程序中重用相同的逻辑,则只需要将逻辑从处理程序提取到单独的应用程序服务中。

    2K30

    90%的Java程序员不会的10道Java面试题

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。...关于 readObject() 方法, 需要注意的一点很重要一点是, 它用于从持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确的类型。

    1K00

    来一场Java高级的面试,看看自己啥水准

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。...关于 readObject() 方法, 需要注意的一点很重要一点是, 它用于从持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确的类型。

    1K10

    史上最难10道 Java 面试题!

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。...关于 readObject() 方法, 需要注意的一点很重要一点是, 它用于从持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确的类型。

    85230

    听说这10道Java面试题90%的人都不会!!!

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    64120

    挑战10个最难回答的Java面试题(附答案)

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    1.4K40

    挑战 10 道超难 Java 面试题

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    73420

    Java 大牛看过来,挑战10道超难 Java 面试题!

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    72931

    挑战 10 道超难 Java 面试题

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    75310

    挑战 10 道超难 Java 面试题

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    69820

    10个最难回答的Java面试题

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...关于 readObject() 方法, 需要注意的一点很重要一点是, 它用于从持久性读取字节, 并从这些字节创建对象, 并返回一个对象, 该对象需要类型强制转换为正确的类型。

    81920

    10 大 Java面试难题,打趴无数面试者!

    线程在监视器上等待,为执行等待,我们需要2个参数: 一个线程 一个监视器(任何对象) 在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。...2) 枚举单例自行处理序列化 传统单例的另一个问题是,一旦实现可序列化接口,它们就不再是 Singleton, 因为 readObject() 方法总是返回一个新实例, 就像 Java 中的构造函数一样...编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。...当你通过实现添加接口来更改类的结构时, 添加或删除任何字段可能会破坏默认序列化, 这可以通过自定义二进制格式使不兼容的可能性最小化, 但仍需要大量的努力来确保向后兼容性。...问题 8) 假设新类的超级类实现可序列化接口, 如何避免新类被序列化? 在 Java 序列化中一个棘手的面试问题。

    1.8K21

    用 C++构建自己的 GPT 文档工具

    你可能会得到这样的结果: ➢ 当然可以,下面是从 1 到 10 计数的 C++ 代码: 没有任何源代码。 原因如下:发送给 API 的 stop 参数让模型知道它应该在输出的哪个点上停止生成更多内容。...下面是我们所使用的函数的描述: OLEMethod():一个辅助函数,用于调用 IDispatch 接口上的方法,处理方法调用并返回指示错误的 HRESULT 值。...你可以在我们的源代码中看到这是如何实现的,但一般来说,我们从批注开始,转到相关的文本,并检查批注是否得到了处理。...API 接口通用代码 为了通过网络与任何 API 接口,我们使用了通用代码来方便地发送请求并使用 JSON 数据格式解析响应。...在此过程中,我们使用了 libCurl,这是一个强大的工具,被广泛用于使用命令行或脚本在网络上传输数据。

    43720

    我在实施蓝绿部署后遇到的问题和解决方法

    对数据源或 API 的任何破坏性更改都意味着旧版本的请求不能被新版本处理,这就排除了蓝绿发布的可能性。...这是我最喜欢问的面试问题之一,问一个人如何在蓝绿环境中处理破坏性更改,以避免有人提出了一个很好的解决方案,但它可能会涉及一些定制的路由层来丰富或调整“旧”请求以适应“新”系统。...这意味着,除非我们首先从后端传播更改(这并不总是可行,特别是当蓝和绿共享同一个数据库时),否则我们将面临路由无法处理请求的风险。...你对需求的猜测很有可能是错误的。 然而,你应该从一开始就让这些未来的变更变得可行且容易。这意味着在构建整体应用程序设计时,你应该考虑如何在数据库级别实现更改,以及如何向 API 中添加版本等。...如果你的架构中没有契合点,也没有比其他架构更容易被大流量冲击的点,并且如果你的组件只是彼此通信,而且部署在相同的近似位置(例如,相同的云或相同的数据中心),那么你可能无法从微服务架构中获得很大的收益。

    96240

    来自前端同学对后端童鞋的吐槽!@!#^$%

    如果后端的底层结构一旦发生更改,接口很有可能也需要发生更改,前端的调用代码也需要随之更改。...既然无论如何都要对接口判断两次,那为什么不将meta.code与 HTTP code 合二为一?更何况我还需要再本地维护一份自定义 code 的枚举值,还需要和后端保证同步。...以请求失败的错误信息为例,错误信息只会出现在接口非正常返回的情况下,但我们应该始终在返回体中用一个字段为它预留位置吗?...在概念之下如何实现它我们拥有很多种选择。...如果是后端之间的交互还可以利用 WebHook。我通常对新技术持保留态度,但是不得不承认 GraphQL 在处理某些需求上也能够比 REST API 做的更好。

    44520

    有理有据:一篇来自前端同学对后端接口的吐槽!

    如果后端的底层结构一旦发生更改,接口很有可能也需要发生更改,前端的调用代码也需要随之更改。...既然无论如何都要对接口判断两次,那为什么不将meta.code与 HTTP code 合二为一?更何况我还需要再本地维护一份自定义 code 的枚举值,还需要和后端保证同步。...以请求失败的错误信息为例,错误信息只会出现在接口非正常返回的情况下,但我们应该始终在返回体中用一个字段为它预留位置吗?...在概念之下如何实现它我们拥有很多种选择。...如果是后端之间的交互还可以利用 WebHook。我通常对新技术持保留态度,但是不得不承认 GraphQL 在处理某些需求上也能够比 REST API 做的更好。

    95820

    Eclipse的BIRT:使用Design Engine API

    此外,它还有一个用于按照国家来对项目进行分组的表格组和一些列出了有界数据集属性的列。 当从表格中删除一列时,没有明确定义列宽度的其他列,它们的宽度被重新计算的结果并不令人满意。...您需要了解那些必须被用于实现图表功能的程序接口,并遵循izs创建图表的严格规则。我猜测结果看起来像rpt设计人员使用的3选项卡作为图表设置。...使用DEAPI进行表格操作 在这种情况下,列的宽度可以从代码中看到的固定像素值。宽度的重新计算将在coldropedum之后执行。但是,我们要如何通过API删除一列表格呢?...当更改不那么复杂时,我更喜欢使用脚本,比如设置报告参数或数据集的颜色。当一个场景如本文所述时,API解决方案是一个不错的选择。...有了这个API,您可以通过Java访问rpt文件,这使得在运行时操作甚至创建这些文件提供了可能性。

    2.5K20
    领券