分离业务逻辑和模型

Blu*_*ber 6 python orm sqlalchemy separation-of-concerns

我有这个问题一直困扰着我一段时间.乍一看,它似乎是一个相当基本的问题,但似乎没有一个明确的答案.我提出这个问题的基础是一个通过SQLAlchemy使用PostgreSQL的Python项目,但使用的特定语言和工具并不重要.

基本问题是在使用ORM时放置逻辑?更具体地说,我的映射类的方法应该采用什么逻辑?

似乎有一些明确的案例,例如,属性的基本验证,例如最小长度或某些电子邮件地址是否属于ORM层(甚至是数据库本身).

一个简单的具体示例是有序的,因此我们假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们唯一的ID),一个密码和一个激活ID.创建帐户时,会分配激活ID并将其邮寄给用户,然后使用该ID设置密码.

我们来看几个场景:

  • 用户创建一个帐户;
  • 用户激活帐户(即设置密码).

因此,当用户创建帐户时,我们需要运行一些基本验证:

  • 电子邮件地址正确=> ORM;
  • 电子邮件地址unique => ORM或数据库(唯一约束);
  • 设置随机激活id => ORM

当用户激活她的帐户时,我遇到了问题.我想验证提供的密码(例如足够长?足够的数字?),但模型应使用某种散列或加密算法存储密码.似乎有两种选择:

1:检查模型之外的激活ID和密码有效性,散列密码然后将User.password设置为散列,并将User.activation id设置为null(以指示活动帐户).

2:创建一个User.activate(activation_id,password)方法,该方法验证每个并相应地设置User.password和User.activation_id属性.

3:混合选项,执行选项1,但在设置密码时设置某种挂钩或事件激活_id = null(如果我们假设可以设置激活ID或密码,则此挂钩满足基本一致性属性该模型).

我在互联网上搜索过,有些消息来源谈论这个问题(包括一些SO问题),但没有人真正回答这个问题.