Giter Site home page Giter Site logo

dayatang / dddlib Goto Github PK

View Code? Open in Web Editor NEW
647.0 647.0 280.0 51.54 MB

A DDD (Domain Driven Design) Library, derived from the idea of Eric Evans' book: 'Domain-Driven Design: Tackling Complexity in the Heart of Software'

License: Apache License 2.0

Java 99.98% HTML 0.02%

dddlib's Introduction

DDDLib

DDDLib是一个领域驱动设计(Domain Driven Design,简称DDD)类库,它的目的是:

  • 为基于DDD的开发范式提供基本的接口和抽象,实现一致性。
  • 支持业务代码和技术代码分离。使领域层代码纯粹表达业务概念和业务规则,将具体技术隔离出去。
  • 隔离业务代码对对IoC容器和持久化框架等等基础设施的依赖。可以自由切换IoC容器(Spring、Guice、TapestryIoC等)和持久化框架(JPA,Hibernate等)的实现。
  • 减轻开发人员的工作负担,降低开发人员的“概念重量”。绝大多数开发人员只需要了解dddlib-domain模块,而且只需要了解dddlib-domain中的几个类:Entity、EntityRepository、InstanceFactory和四种查询对象。
  • 提供程序设计中经常用到的工具,例如Excel导入导出、系统配置、规则引擎封装,等等。

模块结构

DDDLib是一个多模块Maven项目,一共有十多个模块,可以粗略划分为核心模块、IoC模块、持久化模块和外围模块三大类。用户项目编码时需要直接依赖核心模块,在部署时选定一个IoC模块和一个持久化模块,如果有必要时可以选用一些外围模块。对于项目中的大部分开发人员,都只需要了解核心模块dddlib-domain,甚至只是dddlib-domain中的少数的几个接口和类,所以可以大大降低“概念重量”。

核心模块

  • dddlib-domain:整个DDDLib的核心。在用户项目中作为编译时依赖存在,就是说,用户项目在编码时要实现、继承或使用dddlib-domain中的接口和类。

IoC模块

  • dddlib-ioc-spring:实现对Spring Ioc容器的封装,为用户项目提供依赖注入能力。在用户项目中作为可选的运行时依赖存在,用户项目在编码时不需要实现、继承或使用dddlib-ioc-spring中的接口和类。

  • dddlib-ioc-guice:实现Google Guice IoC容器的封装,为用户项目提供依赖注入能力。在用户项目中作为可选的运行时依赖存在,用户项目在编码时不需要实现、继承或使用dddlib-ioc-spring中的接口和类。

  • dddlib-ioc-tapestry:实现TapestryIoC容器的封装,为用户项目提供依赖注入能力。在用户项目中作为可选的运行时依赖存在,用户项目在编码时不需要实现、继承或使用dddlib-ioc-tapestry中的接口和类。

持久化模块

dddlib-persistence是持久化模块。它包含下面三个子模块:

  • dddlib-persistence-jpa:使用JPA作为后端的持久化实现技术,为用户项目提供持久化能力。在用户项目中作为可选的运行时依赖存在,用户项目在编码时不需要实现、继承或使用dddlib-persistence-jpa中的接口和类。

  • dddlib-persistence-hibernate:使用Hibernate作为后端持久化技术,为用户项目提供持久化能力。在用户项目中作为可选的运行时依赖存在,用户项目在编码时不需要实现、继承或使用dddlib-persistence-hibernate中的接口和类。

  • dddlib-persistence-test:一个测试模块,为其余的持久化模块提供测试支持。

下面的模块与持久化有关,但作为顶级的模块存在:

  • dddlib-query-channel:查询通道模块,为分页查询提供扩展的功能。如果用户项目需要使用此功能,必须把该模块添加为编译时依赖。

外围模块

  • dddlib-utils:通用工具类模块。提供各种方便的工具类来操作JavaBean、数组、集合、日期、日志等等。其中最重要的一个类是断言类Assert。可以使用Assert进行防御式编程,提高系统的健壮性和可靠性。本模块为dddlib-domain所依赖,因此用户项目对该模块有编译时依赖。

  • dddlib-configuration:为从各种来源读取键值型配置信息提供统一的接口和实现类。目前提供了能够从以下各种来源读取配置信息的实现类:文件系统文件、类路径文件、数据库、远程url等等。除了URL形式的实现是只读的之外,其他实现都是可读写的,能够把修改后的配置数据写回其来源中。

  • dddlib-cache:缓存模块。为用户系统提供告诉缓存支持。目前采用memcached实现,将来将划分为一个公共的API模块和几个实现模块,不同的实现模块采用不同的缓存技术实现,如memcached、redis、ehcache等。

  • dddlib-datasource-monitor:数据源监控模块。可以监控数据源的运行状态。

  • dddlib-datasource-router:数据源路由模块。主要为SaaS应用服务,将不同的租户的数据库访问路由到不同的服务器或数据库。本模块特别为MySQL进行了优化,除了实现数据库路由之外还实现了读写分离。

  • dddlib-datasource-saas:新版本的SaaS数据源,将不同的租户的数据库访问路由到其专有的数据库。可以采用多种路由策略(例如例如不同的租户的数据库拥有不同ip、不同端口、不同的数据库名称、不同的实例、不同的jndi,等等)。支持各种各样的数据库服务器以及各种各样的数据库连接池。

  • dddlib-db:为数据库访问提供专门的工具类,包括BTM事务管理器、DBUnit、MySQL和Oracle数据库管理器等等。本模块主要为数据库集成测试提供支持。

  • dddlib-excel:为读写Excel文件内容提供支持。采用Apache POI技术实现,支持.xls和.xlsx两种格式的Excel文件。

  • dddlib-i18n:为国际化和本地化提供支持。

  • dddlib-observer:在实体层面实现观察者模式实现。当一个实体发生某些事件时向注册的观察者实体发送通知。

  • dddlib-rule-engine:为有状态和无状态规则服务提供接口和实现。实现是基于规则引擎规范jsr94的。

使用范例

github上的项目hrm-demo是一个使用DDDLib的范例项目。这个项目尚在开发中。

========= 各个子模块的详细说明请参阅具体模块的README.md文件

dddlib's People

Contributors

dayatang avatar dependabot[bot] avatar donsunsoft avatar gdyangyu avatar lingen avatar openkoala avatar vakinge avatar wangjianbing925 avatar zacker330 avatar zhaojh221 avatar zyb2013 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dddlib's Issues

AbstractEntity类的问题

AbstractEntity作为DDD的基类,在使用时我发现了的几个问题:

  1. 如果我的的ID不是LONG类型, 无法扩展修改
  2. 如果我的继承策略是TABLE_PER_CLASS, 则会报异常: "Cannot use identity column key generation with mapping for". 原因是由于ID的生成策略被设置为AUTO, TABLE_PER_CLASS继承策略不允许. 但由于注解的位置在字段,所以无法override该ID的生成策略.
  3. 第二个问题可以通过继承id getter setter并abstract,再通过具体类在getter上override id的生成策略
  4. 实际使用时会由于多态、重写方法的注解,会使注解的位置混乱,可能导致的未知问题。hibernate推荐把注解统一写在getter上。

还有3.5的版本的代码吗?

你好,由于我们有个遗留项目采用了dddlib的3.5版本,近期需要重启该项目。我在分支和标签里面都找不到3.5这个版本。请问我要怎么找到3.5的代码或者现有的仓库?

CVEs in the dependencies are in the execution path of your project

Your project uses some dependencies with CVEs. I found that the buggy methods of the CVEs are in the program execution path of your project, which makes your project at risk. I have suggested some version updates. Here is the detailed information:

  • Vulnerable Dependency: mysql : mysql-connector-java : 5.1.35

  • Call Chain to Buggy Methods:

    • Some files in your project call the library method com.mysql.jdbc.NonRegisteringDriver.connect(java.lang.String,java.util.Properties), which can reach the buggy method of CVE-2017-3586.

      • Files in your project:
        dddlib-datasource-router/src/main/java/org/dayatang/mysql/jdbc/GeminiReplicationConnection.java
      • One of the possible call chain:
      com.mysql.jdbc.NonRegisteringDriver.connect(java.lang.String,java.util.Properties)
      com.mysql.jdbc.ConnectionImpl.getInstance(java.lang.String,int,java.util.Properties,java.lang.String,java.lang.String)
      com.mysql.jdbc.ConnectionImpl.<init>(java.lang.String,int,java.util.Properties,java.lang.String,java.lang.String)
      com.mysql.jdbc.ConnectionImpl.createNewIO(boolean)
      com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(boolean,java.util.Properties)
      com.mysql.jdbc.ConnectionImpl.coreConnect(java.util.Properties)
      com.mysql.jdbc.MysqlIO.doHandshake(java.lang.String,java.lang.String,java.lang.String)
      com.mysql.jdbc.MysqlIO.negotiateSSLConnection(java.lang.String,java.lang.String,java.lang.String,int)
      com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(com.mysql.jdbc.MysqlIO)
      com.mysql.jdbc.ExportControlled.getSSLSocketFactoryDefaultOrConfigured(com.mysql.jdbc.MysqlIO) [buggy method]
      
  • Update suggestion: version 8.0.19
    8.0.19 is a safe version without CVEs. From 5.1.35 to 8.0.19, 6 of the APIs (called by 10 times in your project) were removed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.