- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在用 PHP 编写一个必须写入三个持久层的系统:
这是遗留系统的原因,无法更改。
我想使用 DataMapper 模式,并且我正在尝试建立实现我想要的目标的最佳方法。我有如下界面:
<?php
$service = $factory->getService()->create($entity);
?>
为了简洁起见,下面是一些人为设计和简化的代码:
<?php
class Post extends AbstractService
{
protected $_mapper;
public function create(Entity $post)
{
return $this->_mapper->create($post);
}
}
class AbstractMapper
{
protected $_persistence;
public function create(Entity $entity)
{
$data = $this->_prepareForPersistence($entity);
return $this->_persistence->create($data);
}
}
?>
我的问题是,由于存在三个持久层,因此每个层也可能需要三个映射器。我想要一个干净的设计模式启发界面来完成这项工作。
我认为它具有三个选项:
我觉得这些解决方案中的每一个都有问题,如果有任何反馈/认可的设计模式可能适合这个问题,我将不胜感激。
最佳答案
在 PEAR DB 时代,我不得不解决一个类似的问题,但是很多年前。在这种特殊情况下,需要跨多个数据库复制数据。
我们没有遇到不同数据库具有不同映射的问题,所以它更简单一些。
我们所做的是对 DB 类进行外观处理并覆盖 getResult 函数(或调用的任何函数)。然后这个函数分析了 SQL,如果它是一个读 - 它会把它发送给一个支持的,如果它是一个写,它会把它发送给所有的。
对于一个使用率非常高的网站,这实际上非常有效。
从那个背景来看,我建议完全覆盖所有持久性操作。完成后,实现细节就不那么重要了,可以随时更改。
从这个角度来看,您的任何实现想法似乎都是一种合理的方法。不过,您需要考虑很多事情。
还有另一种方法可以解决这个问题。那就是使用存储过程。如果您有一个主数据库服务器,您可以编写一个触发器,它在提交(或大约)时连接到另一个数据库并同步数据。
如果不需要立即更新数据,您可以让主数据库记录更改,并使用另一个脚本定期将此数据“输入”到另一个系统中。同样,需要考虑错误问题。
希望这对您有所帮助。
关于具有多个持久层的 PHP DataMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064256/
我正在阅读 Zend Framework 快速入门教程,在他们的演示代码中,他们使用了一个数据映射器,该映射器使用 Zend_DB_Table 来访问数据库(参见:http://framework.z
到目前为止,我一直在所有c#数据库驱动的应用程序中使用Active记录。但是现在我的应用程序需要将我的持久性代码与业务对象分开。我已经阅读了很多有关Martin Fowler的数据映射模式的文章,但是
我读过很多有关 DataMapper 模式的内容。 据我所知,DataMapper 应该将表单模型对象映射到实体对象。因此被用作某种适配器。 我理解正确吗? 最佳答案 不,Data Mapper是关于
我正在尝试使用新的 DataMapper 模型映射遗留 MySQL 数据库。 MySQL 模式: CREATE TABLE IF NOT EXISTS `backer` ( `backer_id`
我有一个带有几个字段和唯一约束的数据映射器对象。实际上,这确保了每个用户 ID 每个日期代码只能创建一条记录。 class Form include Datamapper::Resource
问题是我无法将列类型更改为“文本” 这是我看到的错误: DarkBook:playground Justin$ rake migrate_up (in/Users/Justin/Dropbox/Bus
我只是希望以随机顺序返回 DataMapper 记录。 这是我的模型(使用 DataMapper 和 sqlite3 数据库): class Movie include DataMapper::R
我在以下代码中遇到关联问题。 我遇到的错误是对最后一行代码的评论。 编辑:我简化了代码... require 'rubygems' require 'data_mapper' # requires a
我正在使用 Ruby/Sinatra 和 Datamapper 编写网络应用程序。我有一些表,我想将数据预加载到其中。有没有最佳实践?例如。我有一个名为 references 的表 id name u
我正在使用带有 DataMapper MySql 数据库的简单 Sinatra 网络应用程序。我声明了一个具有属性的 Datamapper Post 类 property :created_at, D
我有以下模型 class TagType include DataMapper::Resource ## Relationships belongs_to :category has
我正在使用 Ruby 中的 Sinatra 和 Datamapper 编写一个简单的应用程序,但我遇到了一个问题 — 当我尝试将数据保存到我的 SQLite 数据库时,没有任何变化。但是当我尝试安装数
我有一张产品表,其中包含 SKU、名称等属性。 似乎我需要为每个类别的产品创建单独的表格,因为类别的功能种类繁多。 假设我有一张放 Boot 、工具和帽子的 table /类 我想(除非有更好的方法)
我正在用 PHP 编写一个必须写入三个持久层的系统: 一个网络服务 两个数据库(一个mysql一个mssql) 这是遗留系统的原因,无法更改。 我想使用 DataMapper 模式,并且我正在尝试建立
我有一个这样的数据库模式 DataMapper.setup :default, "sqlite://#{Dir.pwd}/image.db" class Image include DataM
我有两个看起来像这样的模型 class Stage include DataMapper::Resource property :id, Serial belongs_to :
使用以下模型,我正在寻找一种高效且直接的方法来返回所有具有 0 个父任务(本质上是顶级任务)的任务。我最终也想返回 0 个子任务之类的东西,所以一个通用的解决方案会很好。这是否可以使用现有的 Data
我目前正在开发一个基于现有数据库的新应用程序,使用 DataMapper 进行数据访问。但是,它在处理外键时的约定不是数据库使用的约定。 例子: class Invoice include Dat
谁能给我解释一下这是怎么回事吗? 这是我放在一起向大家展示的示例: class Person include DataMapper::Resource property :id, Serial
class Alpha include DataMapper::Resource property :id, Serial property :name, String has n
我是一名优秀的程序员,十分优秀!