DDD系列:三、Repository模式

ddd的战术篇: CQRS CQRS。 将query与command处理分离,使用不同的模型与框架来处理query, command。 command使用domain model,query使用view model。在实现query处理中可以使用更易于查询的框架。 阅读详情
AI摘要

文章探讨了AnemicDomainModel的不足,如缺乏业务逻辑、数据一致性难以保证等问题,并介绍了Repository的角色,强调其在业务逻辑和数据存储间的隔离作用。接着,文章提到了DO、Entity和DTO的区别以及转化器的使用,阐述了模型对象间的关系和转化规则。此外,文章讨论了CQRS模式,用于分离读写操作,提高系统扩展性和性能,以及EventSourcing模式,用于存储模型状态变化的历史,确保数据一致性。

为什么需要Repository?​

Anemic Domain Model(贫血领域模型)特征:

  1. 有大量的XxxDO对象:这里DO虽然有时候代表了Domain Object,但实际上仅仅是数据库表结构的映射,里面没有包含(或包含了很少的)业务逻辑;
  2. 服务和Controller里有大量的业务逻辑:比如校验逻辑、计算逻辑、格式转化逻辑、对象关系逻辑、数据存储逻辑等;
  3. 大量的Utils工具类等。

Anemic Domain Model的缺陷:

  1. 无法保护模型对象的完整性和一致性:因为对象的所有属性都是公开的,只能由调用方来维护模型的一致性,而这个是没有保障的;之前曾经出现的案例就是调用方没有能维护模型数据的一致性,导致脏数据使用时出现bug,这一类的bug还特别隐蔽,很难排查到。
  2. 对象操作的可发现性极差: 单纯从对象的属性上很难看出来都有哪些业务逻辑,什么时候可以被调用,以及可以赋值的边界是什么;比如说,Long类型的值是否可以是0或者负数?
  3. 代码逻辑容易重复: 比如校验逻辑、计算逻辑,都很容易出现在多个服务、多个代码块里,提升维护成本和bug出现的概率;一类常见的bug就是当贫血模型变更后,校验逻辑由于出现在多个地方,没有能跟着变,导致校验失败或失效。
  4. 代码的健壮性差:比如一个数据模型的变化可能导致从上到下的所有代码的变更。

充血模型中,需要严格区分的两个模型:

  • 数据模型(Data Model):指业务数据该如何持久化,以及数据之间的关系,也就是传统的ER模型。只属于Infrastructure Layer
  • 业务模型/领域模型(Domain Model):指业务逻辑中,相关联的数据该如何联动。只属于Domain Layer

链接了这两层的关键对象,就是Repository。

Repository的价值

   在传统的数据库驱动开发中,我们会对数据库操作做一个封装,一般叫做Data Access Object(DAO)。DAO的核心价值是封装了拼接SQL、维护数据库连接、事务等琐碎的底层逻辑,让业务开发可以专注于写代码。但是在本质上,DAO的操作还是数据库操作,DAO的某个方法还是在直接操作数据库和数据模型,只是少写了部分代码。

   所以,Repository 的价值是:

  1. 向内层,屏蔽存储相关的逻辑:
    • 业务逻辑(DomianService) 和 DB相关的操作(DAO、DB)隔离开,业务逻辑中不关心数据存储形式和技术
  2. 向外层,屏蔽业务变化
    • 业务迭代时,如果不调整DB字段,仓储层不变化。

模型对象代码规范

模型类型:

3种模型的区别,Entity、Data Object (DO)和Data Transfer Object (DTO):

  • DO(数据对象)

    ​ 在DDD的规范里,DO应该仅仅作为数据库物理表格的映射,不能参与到业务逻辑中。为了简单明了,DO的字段类型和名称应该和DB中的字段类型和名称一一对应。(当然,实际上也没必要一摸一样,只要你在Mapper那一层做到字段映射)

  • Entity(实体对象)

    ​ 实体对象是我们正常业务应该用的业务模型,它的字段和方法应该和业务语言保持一致,和持久化方式无关。也就是说,Entity 和 DO 很可能有着完全不一样的字段命名和字段类型,甚至嵌套关系。Entity的生命周期应该仅存在于内存中,不需要可序列化和可持久化。

  • DTO(传输对象):

    ​ 主要作为Application Layer 的入参和出参,比如CQRS里的Command、Query、Event,以及Request、Response等都属于DTO的范畴。DTO的价值在于适配不同的业务场景的入参和出参,避免让业务对象变成一个万能大对象。该对象需要序列化,其余两模型都不能实现序列化接口。

模型对象间的关系:

  • 复杂的Entity拆分多个DO对象
  • 多个关联的 Entity 合并一个 DO
  • 从复杂 Entity 里抽取部分信息形成一个 DTO 列表
  • 从多个 Entity 中提取信息,输出一个 DTO

模型转化器

请添加图片描述

DTO Assembler:

​ 在 Application 层,Entity 与 DTO 之间的转化器有一个标准的名称叫DTO Assembler,他的核心作用就是将1个或多个相关联的Entity转化为1个或多个DTO。

Data Converter:

​ 在Infrastructure层,Entity 与 DO 的转化器没有一个标准名称,但是为了区分 Data Mapper(Mybatis的Mapper),我们叫这种转化器Data Converter。

带来的好处:

​ 通过抽象出一个 Assembler/Converter 对象,把复杂的转化逻辑都收敛到一个对象中,并且可以很好的进行单元测试。

带来的问题:

  • 当业务复杂时,手写 Assembler/Converter 是一件耗时且容易出bug的事情,所以业界会有多种Bean Mapping的解决方案,从本质上分为动态和静态映射。
    • 动态映射根据反射动态赋值,大量的反射调用,将带来性能问题。
    • 推荐使用 MapStruct(MapStruct官网),该组件通过注解,在编译时静态生成映射代码,其最终编译出来的代码和手写的代码在性能上完全一致,且有强大的注解等能力。
  • 从使用复杂度角度来看,区分了DO、Entity、DTO带来了代码量的膨胀(从1个变成了3+2+N个)。但是在实际复杂业务场景下,通过功能来区分模型带来的价值是功能性的单一和可测试、可预期,最终反而是逻辑复杂性的降低。

Repository代码规范

​ Repository 出现的目的,是为了将 业务逻辑(软件) 与 硬件(DB、Cache、文件系统等)和 固件(与硬件强关联的软件)完全隔离开。所以为了体现出软件的特点,Repository 中需要注意以下三点:

  1. 接口名称不应该使用底层实现的语法: 常见的insert、select、update、delete都属于SQL语法,使用这几个词相当于和DB底层实现做了绑定,在 Repository 为了区分开,我们使用语法如find、save(insert或update)、remove。
  2. 出参入参不应该使用底层数据格式: Repository 操作的是 Entity 对象(实际上应该是Aggregate Root),不应该直接操作 DO。Repository 接口存在于 Domain 层,实现类 建议 在 Infrastructure 层。
  3. 应该避免所谓的“通用”Repository模式: 很多ORM框架都提供一个“通用”的Repository接口,然后框架通过注解自动实现接口,比较典型的例子是Spring Data、Entity Framework等,这种框架的好处是在简单场景下很容易通过配置实现,但是坏处是基本上无扩展的可能性(比如加定制缓存逻辑),在未来有可能还是会被推翻重做。当然,这里避免通用不代表不能有基础接口和通用的帮助类。

复杂Aggregate的save

​ 在对一个复杂Aggregate(包含多个Entity)的 save 操作中,并不是所有 Aggregate 里的 Entity 都需要变更。

​ 如果不知道 Aggregate 中的变更有哪些,那么只有全量更新,导致大量的无用DB操作;如果我们可以追踪到变更的 Entity,那么将可以减少很多无用的 DB 操作。

业界目前有两个主流的变更追踪方案:

  1. 基于Snapshot的方案:当数据从DB里取出来后,在内存中保存一份snapshot,然后在数据写入时和snapshot比较。常见的实现如Hibernate
  2. 基于Proxy的方案:当数据从DB里取出来后,通过weaving的方式将所有setter都增加一个切面来判断setter是否被调用以及值是否变更,如果变更则标记为Dirty。在保存时根据Dirty判断是否需要更新。常见的实现如Entity Framework。

方案对比:

Snapshot(推荐)Proxy
复杂程度通过cache实现,使用流程较简单通过代理标记实现,工具类较复杂,使用流程简单
内存消耗高无额外内存占用
带来的问题cache与DB的数据一致性问题代理标记Dirty时,对复杂Aggregate的判断问题

Repository的迁移流程

​ 使用 Repository 模式最大的收益就是可以彻底和底层固件解耦,让上层业务可以快速自发展。

假设传统方式下,查询数据只有如下两个类:

  • OrderDO:和DB一样的数据结构
  • OrderDAO:和DB交互的业务操作类

其升级流程如下:

  1. 生成Order实体类,初期字段可以和OrderDO保持一致
  2. 生成OrderDataConverter,通过MapStruct(Java Bean转换器)基本上2行代码就能完成
  3. 写单元测试,确保Order和OrderDO之间的转化100%正确
  4. 生成OrderRepository接口和实现,通过单测确保OrderRepository的正确性
  5. 将原有代码里使用了OrderDO的地方改为Order
  6. 将原有代码里使用了OrderDAO的地方都改为用OrderRepository
  7. 通过单测确保业务逻辑的一致性。

CQRS 和 EventSourcing 模式

什么是CQRS模式?

   CQRS是 Command and Query Responsibility Segregation 的缩写,直译是命令与查询责任分离的意思。

这里涉及到两个定义,何为命令?何为查询?

  • 命令会改变对象的状态,但不返回任何数据。
  • 查询会返回数据,但并不改变对象的状态。

   如果将查询和命令简化理解成对数据的读写操作, CQRS模式的含义就是,应用架构中负责模型读写的模块应当分离。这里的分离,不单是程序代码或逻辑上的分离,也包括数据模型,甚至是数据存储的分离。 CQRS Journey的这张图描述了 CQRS 的一种典型应用:
在这里插入图片描述
CQRS模式的优势:

  CQRS 模式通常与 DDD 同时使用,但它不是一种全局性的架构模式,它只适用于特定的bounded context,对于领域模型十分复杂的场景,CQRS模式可以增强架构的扩展性和灵活性,同时降低模块的复杂度。由于读和写的模型分离,可以分别针对读写操作优化,同时避免的数据锁定,对于性能提升也有帮助。

CQRS的缺点:

  1. 实现架构复杂:
    • 它并不是一种易于实现的模式。因为读写责任的分离,它不如 CRUD 来的直观。而且读写数据同步和确保数据一致性会是一个问题。比较常见的作法,是通过事件(Event)来将写操作的结果同步到读操作的数据库中。
  2. 数据一致性问题:
    • 为了确保数据的一致性,常常借用Event Sourcing模式来实现事件的存储和分发。同时由于通过事件实现的数据同步,其实是异步完成的,在分布式系统中,需要考虑数据的最终一致性(Eventual Consistency)。在CQRS模式中,通常写数据具有完全一致性(Full Consistency),而读数据则具有最终一致性。

   这些局限决定了,CQRS模式并非适用于所有场景。它通常只适用于复杂多变,涉及多方操作的场景。而对于业务简单,使用CQRS模式可能会增加开销,但并不能带来明显的好处。使用 CQRS等模式是为了帮我们解决问题,而不是在简单问题上强制某种规范来限制我们。

什么是 Event Sourcing 模式?

   Event Sourcing (ES)模式是一个关于 如何存储domain model状态的模式。这个模式不直接存储模型的状态,而是存储模型状态变化的历史。应用想要获取模型的当前状态时,需要重演整个历史来得到当前状态。 一个常用的解释ES模式的场景,是银行账户。

   账户余额的直观存储方式,是存储余额本身。当用户存入100元时,余额假定是100,其后用户取出10元,余额变为90,其后用户又存入50元,余额变为140。当用户查询余额时,系统直接获取当前余额。

   同样的场景,使用 ES 模式时,系统不存储余额本身,而是存储用户的行为,即Event。当用户存入100元时,存储“存入100”这个Event,当用户取出10元时,存储“取出10”。当用户查询余额时,系统获得所有的Event,然后进行计算,得到余额。这实际上是金融机构存储交易信息的方式。Bitcoin 也是使用同样的方式存储账户的 send 和 receive 操作,并且将所有的Event使用 blockchain 链接起来。

EventSourcing的优势:
1.简化写操作:

  • 所有Event一旦发生,就变为 immutable,写操作就变为简单的添加纪录,避免了复杂的锁定和冲突。
  • 同时ES模式保留了所有状态的历史,容易做 audit,或纠错。

EventSourcing的缺点:

  1. 历史数据的增加,查询操作的性能可能会降低。

   通常 CQRS 模式和 ES 模式会被同时使用。因为通常CQRS模式使用 Event 来同步读写两端的数据,使用ES模式存储Event有助于这种数据同步,在数据出现不一致的情况时(根据CAP理论,这在分布式系统中是不可避免的),读操作端可以通过 replay event 的历史,来确保数据的最终一致性。

DDD之Repository模式 一,传统架构下的实体模型 传统的应用架构,几乎就是根据需求设计数据库的表,根据表建立实体,对应着实体的就是DAO,Service,Controller,也就是传统的MVC三层架构。 回顾下我们平时写的代码,里面有着很多的xxxUtils工具类,很多的参数校验逻辑与业务逻辑混杂在一起,很多的实体类直接与数据库进行一对一映射。 好处很明显,在业务初期,开发起来很容易,相对比较简单,流水线式编码,但是,一旦后期需求变更,业务改造,数据库表发生变化,可能给我们带来毁灭性的负担。所谓牵一发而动全身,前面欠下了技术债, 阅读详情

相关推荐

DDD Repository模式权威指南:从理论到Java实践

根据Martin Fowler和Eric Evans的经典定义,Repository模式“作为领域层和数据映射层之间的中介,其行为类似于一个内存中的领域对象集合” 3。它的核心意图是封装被持久化的对象集合以及对这些对象执行的操作,从而为持久化层提供一个更加面向对象的视图 1。持久化抽象 (Abstraction of Persistence):首要目标是将底层的持久化技术(如SQL、NoSQL数据库或ORM框架)对领域模型隐藏起来。

qq_29328443的博客 1016

设计模式--资源库模式(Repository)

1、模式定义 Repository 是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。 Repository 模式是架构模式,在设计架构时,才有参考价值。应用 Repository 模式所带来的好处,远高于实现这个模式所增加的代码。只要项目分层,都应当使用这个模式。 2,UML

cangqiong_xiamen的博客 1923

ddd的战术篇: Repository的实现

讲解关于repository与specification的实现方法

abchywabc的博客 1万+

DDD中Repository的职责

Repository的职责入参与出参idgmt_modifiedOperation 入参与出参 如果考虑到DummyRepository,那么需要将Repository的入参和出参定义为Domain 如果考虑到Repository可能是一个远程服务,那么可能需要定义为ValueObject 供GET方法使用的retrieve,毫无疑问,这个方法只需要返回ValueObject方法即可,但是Repo...

Qbit编程学习笔记 1967

仓储(Repository)应该属于DDD分层架构中的哪一层?

Repository 是 DDD 中的一个核心模式,用于封装对领域对象(如聚合根)的持久化逻辑,提供一个面向集合的接口,让领域层以类似内存操作的方式访问和管理数据。提供对聚合根的增删改查操作。屏蔽底层数据存储的细节(如数据库类型、ORM 框架)。确保领域层与基础设施层的解耦。在 Eric Evans 的《领域驱动设计》一书中,Repository 被视为领域层的一部分,因为它是领域模型的重要组成部分,与聚合根密切相关。Repository 接口属于领域层。

云笔记,记录工作学习中遇到的问题,希望对你有帮助 1092

DDD—Repository仓储&工厂模式

而一旦涉及到数据逻辑的修改,就要到领域层中去修改代码,重新调试领域层与基础层的交互,或者当切换异构数据库类型时,需要大量修改领域层的代码,将业务逻辑和数据处理逻辑重新适配(主要在于异构数据库导致的SQL或数据对象调整),因此技术升级会变得特别麻烦。DO对象创建时,需要确保聚合根和它依赖的对象同时被创建,如果这项工作交给聚合根来实现,则聚合根的构造函数将变得异常庞大,所以我们把通用的初始化DO的逻辑,放到工厂中去实现,通过工厂模式封装聚合内复杂对象的创建过程,完成聚合根,实体和值对象的创建。...

a6636656的博客 1898

阿里技术专家详解DDD系列 第三讲 - Repository模式

作者|殷浩出品|阿里巴巴新零售淘系技术部写在前面:这篇文章和《阿里技术专家详解DDD系列 第二弹 - 应用架构》隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其...

淘系技术 1万+

DDD系列 - 第6讲 仓库Repository - Mybatis篇

书接上回,之前通过一个关于拆解、微服务、面向对象的故事,向大家介绍了如何从微服务、面向对象一步步演进到DDD的,整个演进过程如下图:其中在领域层,我们定义了富血模型的领域模型,包括聚合、聚合根、实体、值对象等。聚合在代码层面中的表现形式即是一个包Package,起到了边界的作用,聚合内的对象间高内聚,而聚合间低耦合。聚合中放着实体、值对象、仓库等,实体相较于值对象的一个典型区别就是实体存在唯一标识,并且可通过该唯一标识查询到该实体并对其进行相关操作,值对象不存在唯一标识且通常作为实体。

罗小爬的技术宝书 1783

DDD Repository 模式解析

在构建复杂的企业级应用时,我们常常会遇到数据访问层的设计问题。想象一下,一个电商系统在处理大量商品信息时,如何高效、安全地管理这些数据的增删改查操作?这就引出了领域驱动设计(DDD)中的Repository模式。在传统的三层架构中,数据访问层往往直接与数据库交互,这会导致业务逻辑和数据访问逻辑的紧密耦合,使得代码难以维护和扩展。为了解决这个问题,DDD引入了Repository模式,它作为领域模型和数据访问层之间的桥梁,负责封装数据访问逻辑,使得领域模型与数据访问细节解耦。

JavaCodePro的博客 906

Spring Data Jpa实现自定义repository转DTO

主要介绍了Spring Data Jpa实现自定义repository转DTO,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Excel炒股党必备:手把手教你用Power Query免费获取并刷新股票历史数据

本文详细介绍了如何利用Excel中的Power Query工具免费获取并自动刷新股票历史数据,特别适合Excel炒股党。从环境配置、数据源选择到实战操作,手把手教你建立智能数据管道,实现高效投资分析。通过参数化股票代码和定时刷新功能,大幅提升数据更新效率。

weixin_26767391的博客 654

DDD之:Repository仓储模式

在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据。 1.什么事Repository? "A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Clie...

diaohuyi6830的博客 987

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 436

阿里大佬:DDD落地两大步骤,以及Repository核心模式

在正式开始第二篇之前,尼恩说一下自己对DDD的 亲身体验、和深入思考。DDD的本质大大提升 核心代码业务纯度老的mvc架构,代码中紧紧的耦合着特定ORM框架、特定DB存储、特定的缓存、特定的事务框架、特定中间件,特定对外依赖解耦, 很多很多。总之就是 业务和技术紧密耦合,代码的 业务纯度低, 导致软件“固化”, 没法做快速扩展和升级。大大提升 代码工程测维扩 能力DDD进行了多个层次的解耦,包括 持久层的DB解耦,外依第三方赖的隔离解耦,大大提升了 可测试度、可维护度、可扩展度更大限度 积累。

架构师尼恩 2040

S参数反演法

等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式

weixin_43962864的博客 1万+

LVDS接口总结--(0)LVDS硬件电路接口

xilinx LVDS接口硬件总结

zidan1412的博客 9715

DDD中的Repository模式,值得所有人掌握!

大家好,我是飘渺。今天我们继续更新DDD(领域驱动设计) & 微服务系列。在之前的文章中,我们探讨了如何在DDD中结构化应用程序。我们了解到,在DDD中通常将应用程序分为四个层次,分别为用户接口层(Interface Layer),应用层(Application Layer),领域层(Domain Layer),和基础设施层(Infrastructure Layer)。此外,在用户注册的主题中,我们简要地提及了资源库模式。然而,那时我们并没有深入探讨。今天,我将为大家详细介绍资源库模式,这在DDD中是一个非

weixin_54542328的博客 1327

线结构光三维重建(二):光平面标定与激光轮廓提取的实战优化

本文深入探讨了线结构光三维重建中的光平面标定与激光轮廓提取两大核心环节的实战优化。详细介绍了从棋盘格标定板法到自动化高鲁棒性标定的流程优化,并分享了针对复杂工业场景(如低对比度、高反光表面)的激光轮廓提取组合策略,旨在提升三维重建系统的整体精度与稳定性。

weixin_29057237的博客 326

第四章:DDD中的Repository模式

在领域驱动设计(Domain-Driven Design, DDD)中,Repository模式是一种设计模式,它提供了一种机制来封装数据访问逻辑,并且为领域对象提供了持久化服务。在DDD思想中repository表示资源库的概念,用于区分数据模型和领域模型,它充当了领域层与基础设施层之间的桥梁确保领域模型保持纯净,不包含任何关于数据持久化的逻辑。为了保持代码的一致性和可维护性,建议定义一个统一的Repository接口,该接口可以包含一些通用的操作方法。

zhiyikeji的博客 1808

YOLOv10改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

本文记录的是基于MobileNet V3的YOLOv10目标检测轻量化改进方法研究。的模型结构是通过得来的,其中的基础模块结合了的深度可分离卷积、的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意力模块,使模型在性能、效率和灵活性方面都具有显著的优势。本文在替换骨干网络中配置了原论文中的small和large2种模型,以满足不同的需求。

Limiiiing的博客 513

智驾芯片&软件分层&测试

智能驾驶相关的芯片,软件分层,测试相关内容

天赐好车的博客 436

领域驱动设计DDD系列(三)——Repository模式

DDD的宏观理念其实并不难懂,但是如同REST一样,DDD也只是一个设计思想,缺少一套完整的规范,导致DDD新手落地困难。我之前的架构篇主要从顶层设计往下看,从这一篇开始我希望能填补上一些DDD的代码落地规范,帮助同学在日常工作中落地DDD思想,并且希望能通过一整套规范,让不同的业务之间的同学能够更快的看懂、掌握对方的代码。但是规则是死的、人是活的,各位同学需要根据自己业务的实际情况去有选择的去落地规范,DDD的规范不可能覆盖所有场景,但我希望能通过解释,让同学们了解DDD背后的一些思考和取舍。 为什么要

weixin_38002497的博客 4059

GEE训练教程:基于Sentinel-2卫星的归一化建筑指数(NDBI)等的进行城市扩张分析

本文介绍利用Sentinel-2卫星数据和谷歌地球引擎平台监测印度卡姆鲁普都会区2018-2024年城市扩张的方法。通过计算归一化建筑指数(NDBI)、植被指数(NDVI)和水体指数(MNDWI),采用多阈值规则识别建设用地,并量化不同年份的城市扩张面积。代码实现了从数据预处理、指数计算到面积统计的完整流程,为城市扩张研究提供了可复制的技术方案。关键参数包括年份选择、云覆盖阈值和分类阈值,均可根据研究需求调整。该方法能有效追踪城市边界变化,为城市规划提供数据支持。

此星光明博客 135

DDD领域驱动设计内容分享(五):DDD 落地两大步骤,以及Repository核心模式

在正式开始第二篇之前,说一下自己对DDD的 亲身体验、和深入思考。DDD的本质大大提升 核心代码业务纯度老的mvc架构,代码中紧紧的耦合着特定ORM框架、特定DB存储、特定的缓存、特定的事务框架、特定中间件,特定对外依赖解耦, 很多很多。总之就是 业务和技术紧密耦合,代码的 业务纯度低, 导致软件“固化”, 没法做快速扩展和升级。大大提升 代码工程测维扩 能力DDD进行了多个层次的解耦,包括 持久层的DB解耦,外依第三方赖的隔离解耦,大大提升了 可测试度、可维护度、可扩展度更大限度 积累。

之乎者也·的博客 2049

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ddd java repository_DDD之:Repository仓储模式

在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据。1.什么事Repository?"A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client object...

weixin_39637723的博客 549

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: DDD系列:二、应用架构设计演变
下一篇: DDD系列:四、领域层设计规范
BigBug_500
博客等级 码龄8年 1284粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值