abc
的有用模块来创建抽象方法和抽象类 。因为UserRepository
只是一个接口,所以我们可以使用abc
模块 。
任何继承自abc.ABC
的类都将变为抽象类,任何带有@abc.abstractmethod
装饰器的函数都会变为一个抽象函数 。下面是UserRepository
的结构:
-
from abc import ABC, abstractmethod
-
class UserRepository(ABC):
-
@abstractmethod
-
def fetch(self, name:Name) -> User:
-
pass
UserRepository
遵循仓储模式 。换句话说,它在User
实体上提供适当的 CRUD 操作,而不会暴露底层数据存储语义 。在本例中,我们只需要fetch()
操作,因为FindService
只查找用户 。因为
UserRepository
是一个抽象类,我们不能从抽象类创建实例对象 。创建对象必须依赖于一个具体类实现这个抽象类 。数据层UserRepositoryImpl
提供了UserRepository
的具体实现:-
class UserRepositoryImpl(UserRepository):
-
def fetch(self, name:Name) -> User:
-
pass
由于
AddService
将用户数据存储在一个 MySQL 数据库中,因此UserRepositoryImpl
也必须连接到相同的数据库去检索数据 。下面是连接到数据库的代码 。注意,我们正在使用 MySQL 的连接库 。-
from mysql.connector import connect, Error
-
class UserRepositoryImpl(UserRepository):
-
def fetch(self, name:Name) -> User:
-
try:
-
with connect(
-
host="mysqldb",
-
user="root",
-
password="admin",
-
database="glarimy",
-
) as connection:
-
with connection.cursor() as cursor:
-
cursor.execute("SELECT * FROM ums_users where name=%s", (name.value,))
-
row = cursor.fetchone()
-
if cursor.rowcount == -1:
-
raise UserNotFoundException()
-
else:
-
return User(Name(row[0]), PhoneNumber(row[1]), row[2])
-
except Error as e:
-
raise e
root
/ 密码admin
连接到一个名为mysqldb
的数据库服务器,使用名为glarimy
的数据库(模式) 。在演示代码中是可以包含这些信息的,但在生产中不建议这么做,因为这会暴露敏感信息 。fetch()
操作的逻辑非常直观,它对ums_users
表执行 SELECT 查询 。回想一下,AddService
正在将用户数据写入同一个表中 。如果 SELECT 查询没有返回记录,fetch()
函数将抛出UserNotFoundException
异常 。否则,它会从记录中构造User
实体并将其返回给调用者 。这没有什么特殊的 。应用层
最终,我们需要创建应用层 。此模型如图 2 所示 。它只包含两个类:控制器和一个 DTO 。
文章插图
图 2: 添加服务的应用层
众所周知,一个 DTO 只是一个没有任何业务逻辑的数据容器 。它主要用于在
FindService
和外部之间传输数据 。我们只是提供了在 REST 层中将UserRecord
转换为字典以便用于 JSON 传输:-
class UserRecord:
-
def toJSON(self):
-
return {
-
"name": self.name,
-
"phone": self.phone,
-
推荐阅读
- Adobe的人工智能原型可将物体粘贴到照片上 同时添加逼真的照明和阴影
- 适合在家里养的小宠物有哪些,有什么适合家里养的小动物-
- 谢芳|妻子刚生下女儿,就对丈夫说:先给我10万,然后再买一个房子写上我的名字
- 麻将桌上老赢钱的人有什么特点?
- 扑克争上游基本玩法
- 葫芦在家居风水里有什么作用?该放在什么位置?
- 30年前的一分钱现在值多少钱?有没有收藏价值?
- 郭碧婷和向佐在一起多久结婚,郭碧婷向佐结婚了吗-
- 百慕大三角有人吗,百慕大三角存不存在-
- 项羽在什么战役中失败,项羽在楚汉之争中最终失败的原因是什么-