由于种种原因,我们正在编写一个新的业务对象/数据存储库。这一层的要求之一是将业务规则的逻辑和实际的数据存储层分开。架构为业务对象/数据库访问层
实现访问同一对象的多个数据存储层是可能的 - 例如,实现大多数对象的主“数据库”数据存储源以及实现User对象的另一个“ldap”源。在这种情况下,用户可任选地具有略微不同的功能(例如,无法保存/更新用户对象)来从LDAP源,也许,但是否则就由应用程序使用的方式相同。另一种数据存储类型可能是Web服务或外部数据库。
我们正在考虑实施这个方法有两种主要方式,而我和一位同事在基本层面上的意见不一致,这是正确的。我想就一个最适合使用的建议提出建议。我会尽力保持各个尽可能中性的我的描述,因为我在寻找一些客观的观点在这里。
业务对象是基类,数据存储对象继承业务对象。客户端代码处理数据存储对象。
在这种情况下,通用业务规则由每个数据存储对象继承,它是客户端代码直接使用的数据存储对象。
这意味着客户端代码确定哪个数据存储方法用于给定的对象,因为它必须显式地将实例声明为该类型的对象。客户端代码需要明确地知道它正在使用的每种数据存储类型的连接信息。
如果数据存储层为给定对象实现了不同的功能,客户端代码在编译时显式知道它,因为对象看起来不同。如果数据存储方法更改,则必须更新客户端代码。
业务对象封装数据存储对象。
在这种情况下,业务对象直接使用客户端应用程序。客户端应用程序将基础连接信息传递给业务层。关于给定对象使用哪种数据存储方法的决定由业务对象代码决定。连接信息是从配置文件取(客户端应用程序并不真正了解它的细节/保健)的数据块,这可能是一个数据库,或用于各种数据存储类型几件连接字符串一个连接字符串。其他数据存储的连接类型也可以从另一个地方读 - 例如,在指定的URL各种网络服务的数据库的配置表。
这样做的好处是,如果将新的数据存储方法添加到现有对象中,则可以在运行时设置配置设置以确定使用哪种方法,并且它对客户端应用程序完全透明。如果给定对象的数据存储方法更改,则客户端应用程序不需要修改。
业务对象是基类,数据源对象从业务对象继承。客户端代码主要处理基类。
这与第一种方法类似,但客户端代码声明基础业务对象类型的变量,业务对象上的Load()/ Create()/ etc静态方法返回适当的数据源类型对象。
该解决方案的体系结构与第一种方法类似,但主要区别在于决定哪个数据存储对象用于给定业务对象是由业务层制定的,而不是客户机代码。
我知道,提供一些这方面的功能,但请打折那些现在已经存在的ORM库(有一个数据存储层与这些ORM库的一个实现的可能性) - 也注意到我故意不告诉你这里使用的是什么语言,除了它是强类型的。
我在这里寻找一些一般性的建议关于哪种方法更好地使用(或随时提出别的东西),以及为什么。