分离业务逻辑和模型

时间:2013-10-09 16:25:12

标签: python orm sqlalchemy separation-of-concerns

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

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

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

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

让我们看几个场景:

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

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

  • 电子邮件地址正确=&gt; ORM;
  • 电子邮件地址unique =&gt; ORM或数据库(唯一约束);
  • 设置随机激活ID =&gt; 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问题),但没有人真正回答这个问题。

0 个答案:

没有答案