"since": self.since
}
控制器的工作是将 DTO 转换为用于域服务的域对象,反之亦然 。可以从
find()
操作中观察到这一点 。-
class UserController:
-
def __init__(self):
-
self._repo = UserRepositoryImpl()
-
def find(self, name: str):
-
try:
-
user: User = self._repo.fetch(Name(name))
-
record: UserRecord = UserRecord()
-
record.name = user.name.value
-
record.phone = user.phone.value
-
record.since = user.since
-
return record
-
except UserNotFoundException as e:
-
return None
find()
操作接收一个字符串作为用户名,然后将其转换为Name
对象,并调用UserRepository
获取相应的User
对象 。如果找到了,则使用检索到的User`` 对象创建
UserRecord` 。回想一下,将域对象转换为 DTO 是很有必要的,这样可以对外部服务隐藏域模型 。UserController
不需要有多个实例,它也可以是单例的 。通过重写__new__
,可以将其建模为一个单例 。-
class UserController:
-
def __new__(self):
-
if not hasattr(self, ‘instance’):
-
self.instance = super().__new__(self)
-
return self.instance
-
def __init__(self):
-
self._repo = UserRepositoryImpl()
-
def find(self, name: str):
-
try:
-
user: User = self._repo.fetch(Name(name))
-
record: UserRecord = UserRecord()
-
record.name = user.name.getValue()
-
record.phone = user.phone.getValue()
-
record.since = user.since
-
return record
-
except UserNotFoundException as e:
-
return None
我们已经完全实现了
FindService
的模型,剩下的唯一任务是将其作为 REST 服务公开 。REST API
FindService
只提供一个 API,那就是通过用户名查找用户 。显然 URI 如下所示:-
GET /user/{name}
我们可以使用 Flask 框架来构建 REST API,它最初的目的是使用 Python 开发 Web 应用程序 。除了 html 视图,它还进一步扩展到支持 REST 视图 。我们选择这个框架是因为它足够简单 。创建一个 Flask 应用程序:
-
from flask import Flask
-
App = Flask(__name__)
然后为 Flask 应用程序定义路由,就像函数一样简单:
-
@app.route('/user/')
-
def get(name):
-
pass
@app.route
映射到 API/user/
,与之对应的函数的get()
。如你所见,每次用户访问 API 如
http://server:port/user/Krishna
时,都将调用这个get()
函数 。Flask 足够智能,可以从 URL 中提取Krishna
作为用户名,并将其传递给get()
函数 。get()
函数很简单 。它要求控制器找到该用户,并将其与通常的 HTTP 头一起打包为 JSON 格式后返回 。如果控制器返回None
,则get()
函数返回合适的 HTTP 状态码 。