我正在编写REST框架,并且我想实现oauth 2.0。问题是我不希望对运行的数据库有任何限制。
所以我考虑实现这个的方法是让开发人员实现他们自己的DataStore类,它实现了我与之交互的方法。我在Python工作,所以没有办法像在java中那样定义接口,但是我创建了一个基类,它只是为任何方法调用引发NotImplemented,开发人员应该将其子类化
对于我的情况,Datastore对象将有如下方法:
class DataStore(object):
def store_client(client_id, client_secret, client_urls):
...
def get_client(client_id, client_secret)
...
def store_token(client_id, token):
...
....
开发人员将使用他们选择的数据存储方法实现这些方法,尽管我会为常见数据库提供一些实现。
有更好的方法吗?
答案 0 :(得分:1)
我会说这是一种替代方案,可能会或可能不会“更好”或更适合您的需求。您在示例中显示的是传统的DAO或数据存储类型模式。其中对象模型公开了执行所有CRUD操作的方法:读取,更新,创建和删除。这样做的缺点是,在查询或查询数据本身时需要更多逻辑,一个简单的3-4类暴露方法可以扩展到20多种方法。
这是您开始考虑每个单独行为是不同的独立身份的地方。因此,您可能拥有一个具有简单界面的“Accessor”对象,如:
class GetClient(object):
def get(self, client_id):
pass
但主题有几种不同的变体,如:
class AuthenticatedGetClient(GetClient):
def __init__(self, authorization_service, current_user):
#stuff
def get(self, client_id):
if self.auth_svc.permit(self.current_user, client_id):
#actual client get, perhaps you need to screen out additional details, etc.
这更多地遵循CQRS方法,其中您对View表示的模型实际上可能不同,或者将多个DB模型合并在一起。示例:用户模型可以存储user_name,而地址存储地址,并且数据库中确实不存在“配置文件”模型。
这样做的好处是,您可以混合使用更复杂的访问模式,同时抽象出数据存储区并减少呈现给任何其他开发人员的不同API调用的数量。缺点是您需要为每个CRUD操作创建不同的对象表示。