考虑以下两个数据库表
用户
用户 ID PrimaryKey firstname lastname
安全
SecurityID PrimaryKey UserID ForeignKey 权限
所有数据库表都有创建、读取、更新、删除操作 (CRUD)
CRUD 操作可以存在于多个地方
<cfquery>
标签内部
- 存储过程内部
- 其他
问题是所有的 CRUD 操作都以它们自己的方式归为一类。考虑制作一个用户对象 ( user.cfc
)。
<cfcomponent>
<cffunction name="create"></cffunction>
<cffunction name="read"></cffunction>
<cffunction name="update"></cffunction>
<cffunction name="delete"></cffunction>
</cfcomponent>
安全性是用户管理的一部分,那么对象是否与 db 表一对一匹配?在像 ORM 这样的环境中,答案是肯定的,而在其他环境中则不是。
如果您认为安全是用户管理的一部分,您user.cfc
可能看起来像这样
<cfcomponent>
<cffunction name="create"></cffunction>
<cffunction name="read" hint="Read will also read security info"></cffunction>
<cffunction name="update" hint="Perhaps this can update security too"></cffunction>
<cffunction name="delete" hint="Delete will also delete security info"></cffunction>
<cffunction name="create_security"></cffunction>
<cffunction name="read_secrity" hint="This may not even be needed"></cffunction>
<cffunction name="update_security"></cffunction>
<cffunction name="delete_security" hint="This may not even be needed"></cffunction>
</cfcomponent>
在一天结束时,您可能会发现您需要的对象*.cfc
比表格少得多。
好的,现在你有了你user.cfc
,你用它做什么?它可以以各种不同的方式附加到您的应用程序的其余部分
- 应用程序.用户 = 新用户();
- session.User = 新用户();
- 请求.用户 = 新用户();
这些中的每一个都非常来自下一个。在我们选择合适的道路之前,我们必须考虑会员数据,以及我们希望它存在多长时间。
<cfcomponent>
<cfset this.userid = ""><!--- This always points to the user I want to interact with --->
<cffunction name="create"></cffunction>
<cffunction name="read"></cffunction>
<cffunction name="update"></cffunction>
<cffunction name="delete"></cffunction>
</cfcomponent>
您的 CRUD 操作很可能会与其UserID
所有操作交互。您可能会发现更新记录后,您会经常阅读它。UserID
您可能只想设置一次,然后让所有功能都使用同一个,而不是总是说明您正在与之交互。
好的,现在让我们回到你将使用它们的地方
应用程序.用户
User
整个系统中只存在一个对象。它将在请求进入站点时创建。该对象将为每个请求共享。如果您user
在此处附加对象,则表明所有请求都将针对同一用户。
session.UserUser
对于外部世界中的给定最终用户,将存在
一个对象。它将与所有其他最终用户分开。这表明每个最终用户都会查看他们自己的user
内容,并且即使他们在网站上单击,他们仍然会查看相同的内容user
request.UserUser
每个请求将存在
一个对象。它只会针对特定的请求存在,然后被丢弃。这表明User
在这个请求上查看特定是有意义的,但下一个可能会完全不同,甚至可能与用户无关。
~~~~~~~~~~~~~~~
归根结底,您需要决定如何捆绑您的数据库交互,以及将这些捆绑的操作保持在一起多长时间