Python的Clean架构
项目描述
clean-python
clean-python
包含Python中 clean架构 的抽象
它是独立的,以asyncio为核心。
使用的术语一致地来自“大蓝皮书”(E. Evans的《领域驱动设计》,2004年)。软件由一个或多个模块组成,每个模块有四层:展示层、应用层、领域层和基础设施层。每一层都有自己的职责,简而言之
- 展示层:向用户展示信息并解释用户的命令。
- 应用层:实现指导领域对象的用例。
- 领域层:所有领域概念和规则;这一层是软件的核心。
- 基础设施层:支持上层的一般能力
这个项目的灵感主要来自S. Hoogendoorn和其他人的 easy
TypeScript框架(https://github.com/thisisagile/easy)。
动机
使用分层架构的主要目标是隔离与软件技术相关的特定领域概念与其他功能。这样
- 嵌入在领域中的知识被提炼出来,更容易理解和修改。
- 开发者能够快速掌握代码库,因为它使用一致的架构和命名系统。
- 依赖性减少,从而提高了可维护性。
- 单元测试可以更容易地进行(提高可靠性)。
依赖性
层与依赖项松散耦合,仅在一个方向上:展示层 > 应用层 > 基础设施层 > 领域层。换句话说:软件核心业务的依赖项数量尽可能少。
一个模块只能通过其基础设施层依赖另一个模块。参见 InternalGateway
。
这个库最初是用FastAPI开发的Web后端。其核心依赖是pydantic
,用于严格的类型解析和验证。根据需要可以添加可选依赖。
核心概念
领域层
领域层是模型存在的位置。领域模型是一组概念;领域层是模型的体现。领域模型中的概念必须在代码中有1:1的表示,反之亦然。
该层不依赖于所有其他层。可以通过从应用层进行依赖注入与基础设施层交互。允许在基础设施层上运行时依赖,例如设置默认的Gateway
实现。
该层有5种类型的对象
- 实体:具有身份的类型(实例的所有属性都可能改变——但实例仍然是相同的)。实体具有
id
以及与状态变化相关联的默认字段(例如created_at
,updated_at
)。 - 值对象:不具有身份的类型(这些只是复杂的值,如日期时间)。
- 领域服务:不是自然地以对象形式建模的重要领域操作。服务是无状态的。
- 仓库:仓库负责持久化(
添加
/获取
/筛选
)。这需要一个网关来与数据库等接口;通常从应用层注入一个网关实例到仓库。 - 领域事件:领域事件可以发出以表示状态变化。
对象之间的关系很复杂。特别是多对多关系。我们通过将对象分组到聚合中来实现。聚合是一组一起改变/具有相同生命周期(例如一起删除)的对象集合。一个实体是聚合根;我们称它为RootEntity
。ChildEntity
很少发生;通常嵌套对象从RootEntity
派生其身份。
所有更改和访问都通过RootEntity
的仓库进行。RootEntity
可以是复杂的嵌套对象;如何将其映射到SQL数据库是基础设施层的问题。
基础设施层
基础设施层主要包含与单一外部资源接口的网关
对象。网关
实现持久化方法以支持领域层和应用层。大部分实现将在框架或其他依赖中。
网关
的方法可以直接返回领域对象,或者返回包含内置类型(Json
)的字典。
其他网关示例包括:发送电子邮件和logstash日志记录。
应用层
应用层定义了应用的使用案例。示例用例包括创建用户
或列出用户角色
。这些方法与REST API或命令行界面无关;这是表示层的业务。
除了指导领域对象外,应用层方法还可以触发其他行为,如记录或触发其他应用。最初,它可能只是单个函数调用的结果。
该层保持瘦。它指导领域对象,并且可能与其他系统交互(例如通过通过基础设施层发送消息)。应用层不应包含基本领域规则。
表示层
表示层向用户显示信息并解释用户的命令。其主要工作是使应用层的用例对实际用户可用。
在clean-python
中目前只有一种选项,即使用FastAPI的REST API。
模块
将代码分解到模块中的主要目的是防止认知过载。模块将领域层划分,其他一切随之而来。模块之间应该有低耦合,模块内部有高内聚。模块首先和 foremost 是一种概念结构。
在Python中,模块应该使用单个.py文件或一组.py文件组成的文件夹(分别称为模块和包)来实现。
模块具有公共API(表现层)并封装其数据库。只有通过这种方式,模块的领域层才能保证内部一致性。
我们当前的方法是每个模块包含1个聚合(其根实现为RootEntity
)。
安装
clean-python
可以使用以下方式安装:
$ pip install clean-python
可以通过以下方式添加可选依赖项:
$ pip install clean-python[sql,fastapi]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分布
构建分布
clean_python-0.17.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 948d9bd03eb74a860d5de0682fdaba4bcb37418118bd3d1f7620256e6ef49593 |
|
MD5 | a6a7f0579c7f6ebfcceaf4b946459376 |
|
BLAKE2b-256 | 08bc75a9a5a7771526f672b0a2c53e2c0025027c5ef35a316ad371c7a8798a7a |
clean_python-0.17.1-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3d1c63991f55e2b41a0109c5ebd2deabe78d02364cc340aef7bfab80c490cb29 |
|
MD5 | a732c4e216ace0620d113191076425a5 |
|
BLAKE2b-256 | 706a5c3fecf2f956e07078b642a779bf550c5b5d4954fb4db77ca7f5b40dff4c |