3 层架构数据访问
3-Tier Architecture Data Access
我正在研究为 Android 设备开发社交网络应用程序,我将使用位于 n 层架构逻辑层的 RESTful 网络服务。
现在我对数据层和逻辑层有点困惑。我看到逻辑层的规则说 "Should not contain presentation or data access code" 我得到了表示代码部分,但是可以肯定的是,如果我的 Web 服务是 PHP、MySQL 和 Apache,例如我必须有一些东西喜欢
$result = mysql_query("SELECT entry, name, level, description FROM
users ORDER BY name") or die(mysql_error());
(忽略不使用mysqli的事实)
这不属于业务逻辑吗,是否应该在包含数据库的机器上有第二个 Web 服务 运行 此代码基于逻辑层的信息?
在 N 层应用程序中,将中间层与数据存储库的细节或内部工作分开是个好主意。在某些项目中,这可能有点矫枉过正。
这种抽象允许您在不重写业务层逻辑的情况下切换出 RDMS 或连接到多个 RDMS。您的代码也将受益于模块化。
实现此目的的一种方法是使用 CRUD 封装所有数据库 table(ORM 映射器使这变得容易)。从那以后,这些 classes 将成为您的数据层。
例如,在数据层的最高级别,您可能有一个函数,该函数 returns 按 userid 列出的用户,这里的用户是定义的 class,它具有匹配的属性你的数据字段。因此,您没有返回一些系统数据 table 对象,而是返回了您定义的用户对象的列表。
接下来,在您的业务层中,您插入或正在提供数据访问 class,您可以从中获取用户列表(请参阅依赖注入)。您不需要知道,也不关心数据的来源。用户列表可能来自 MySQL、平面文件或远程 Web 服务。这就是为什么分离可能是一件好事。
这种方法的一些缺点是必须依赖第三方 ORM 映射器(它们使开发更快),需要翻译 classes 进行跨界通信,甚至涉及更多计划最小的调整。但是,如果每个实体都有 CRUDS,则最后一点不太可能出现。仅当您更改基础数据的属性时才需要进行调整。
编辑:我忘了提到您的用户存储库的 Get/Update/Insert/Delete 功能通常可以通过隐藏在远程 Web 服务或类似东西中的 api 来访问。
您的数据访问层包含从数据源中提取数据的查询。这些查询通常位于某种存储库接口的后面,该接口允许其他层以松散耦合的方式与数据访问层进行通信。
您的逻辑(又名业务)层包含完成表示层调用的操作所必需的工作流。在分层架构中,该层不应包含原始数据访问查询,而应使用数据访问层通过我上面提到的存储库接口查询数据。我认为这就是该规则试图表达的意思。
我正在研究为 Android 设备开发社交网络应用程序,我将使用位于 n 层架构逻辑层的 RESTful 网络服务。
现在我对数据层和逻辑层有点困惑。我看到逻辑层的规则说 "Should not contain presentation or data access code" 我得到了表示代码部分,但是可以肯定的是,如果我的 Web 服务是 PHP、MySQL 和 Apache,例如我必须有一些东西喜欢
$result = mysql_query("SELECT entry, name, level, description FROM
users ORDER BY name") or die(mysql_error());
(忽略不使用mysqli的事实) 这不属于业务逻辑吗,是否应该在包含数据库的机器上有第二个 Web 服务 运行 此代码基于逻辑层的信息?
在 N 层应用程序中,将中间层与数据存储库的细节或内部工作分开是个好主意。在某些项目中,这可能有点矫枉过正。
这种抽象允许您在不重写业务层逻辑的情况下切换出 RDMS 或连接到多个 RDMS。您的代码也将受益于模块化。
实现此目的的一种方法是使用 CRUD 封装所有数据库 table(ORM 映射器使这变得容易)。从那以后,这些 classes 将成为您的数据层。
例如,在数据层的最高级别,您可能有一个函数,该函数 returns 按 userid 列出的用户,这里的用户是定义的 class,它具有匹配的属性你的数据字段。因此,您没有返回一些系统数据 table 对象,而是返回了您定义的用户对象的列表。
接下来,在您的业务层中,您插入或正在提供数据访问 class,您可以从中获取用户列表(请参阅依赖注入)。您不需要知道,也不关心数据的来源。用户列表可能来自 MySQL、平面文件或远程 Web 服务。这就是为什么分离可能是一件好事。
这种方法的一些缺点是必须依赖第三方 ORM 映射器(它们使开发更快),需要翻译 classes 进行跨界通信,甚至涉及更多计划最小的调整。但是,如果每个实体都有 CRUDS,则最后一点不太可能出现。仅当您更改基础数据的属性时才需要进行调整。
编辑:我忘了提到您的用户存储库的 Get/Update/Insert/Delete 功能通常可以通过隐藏在远程 Web 服务或类似东西中的 api 来访问。
您的数据访问层包含从数据源中提取数据的查询。这些查询通常位于某种存储库接口的后面,该接口允许其他层以松散耦合的方式与数据访问层进行通信。
您的逻辑(又名业务)层包含完成表示层调用的操作所必需的工作流。在分层架构中,该层不应包含原始数据访问查询,而应使用数据访问层通过我上面提到的存储库接口查询数据。我认为这就是该规则试图表达的意思。