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