由于各种原因,我们正在编写一个新的业务对象/数据存储库。其中一个要求的这一层是独立的逻辑的商业规则和实际数据存储层。

它是可能有多个数据存储层进行访问,以同样的对象--例如,一个主要的"数据库"数据存储源,实现了大多数对象,另一个"ldap"源,实现了用户对象。在这种情况下,用户可以选择来自LDAP源,也许略有不同的功能(例如,不可能的保存更新用户的对象),但除此之外,它所使用的程序相同的方式。另一个数据储存的类型可能会是一个网络服务,或外部数据库。

主要有两种方式,我们正在寻找实现这一点,我和一个同工不同意的一个基本水平,这是正确的。我想要些建议中的哪一个是最好的使用。我会尽量保持我的说明每个作为中立的作为可能的,因为我在找一些客观的观点在这里。

  • 业务对象是基类和数据存储目的继承的业务对象。客户代码处理的数据存储的对象。

    在这种情况下,共同业务规则,被继承由每个数据存储目的,并且它的数据存储目的是直接用由客户的代码。

    这具有的含义,客户代码确定哪些数据存储方法的使用对于给定的对象,因为它已明确宣布一个实例类型的对象。客户代码需要明确地知道连接的信息对每个数据储存的类型,它是使用。

    如果数据存储层实现不同的功能,对给定的对象,客户代码明确知道它在编制时间,因为目看起来不同。如果数据存储方法改变时,客户的代码已被更新。

  • 业务对象的封存储数据的对象。

    在这种情况下,业务对象是直接使用的客户应用程序。客户应用程序通过沿基地连接信息业务层。决定关于数据存储方法的一定对象的使用是由商业目的代码。连接的信息将是一大块的数据取自a config文件(客户应用程序并不真的知道/护理有关的细节),这可能是一个单一连串的数据库,或者几条连串的各种数据储存的类型。额外的数据存储连接类型也可以从中读取的另一点--例如,配置表中的数据库,指定网址各网服务。

    这里的好处是,如果一个新的数据存储方法是添加到现有的对象,设置可设置在运行时,以确定使用哪一种方法,它是完全透明的客户应用程序。客户的应用程序不需要修改,如果数据存储的方法给予对象的变化。

  • 业务对象是基类、数据来源的对象继承企业的对象。客户代码,主要涉及与基础课程。

    这是类似于第一种方法,但客户的代码声明变量的基地业务对象的类型和Load()/Create()/etc静态的方法在业务对象返回适当的数据来源类型的对象。

    建筑这种解决方案类似于第一种方法,但主要差别是该决定有关的哪些数据的存储目的使用对于给定的业务对象是由业务层,不客户代码。

我知道已经有现有的对象库,提供一些这方面的功能,但请折扣的那些现在(有可能,数据存储层是实现与其中一个奥姆库)-还注意到,我故意没有告诉你什么样的语言正在这里使用,其他比那强烈类型。

我在找一些一般性意见,在这里,上哪一种方法是更好地使用(或感觉到建议别的东西),以及为什么。

有帮助吗?

解决方案

我可以建议另一个替代的,可能是更好的去耦业务的对象 使用 数据对象和数据的对象 实施 储存的物体。这应该保持业务规则中的业务对象,但没有任何依赖于存储来源或格式,同时允许的数据对象以支持任何操作是必需的,包括改变储存对象动态(例如对于在线操纵)

这个属于第二类以上(业务对象的封存储数据的对象),但是,分开的数据的语义从存储机制的更清楚

其他提示

你可以还有一个门面保持你的客户来电话业务。它还创建共同的入口点到你的业务。

正如所说,你的业务不应该被暴露到任何东西,但你也可与检和门面。

是的。你的客户可以处理的交互.这是最理想的方式传递数据过你的申请。

我通常喜欢"的业务目标封装数据对象/储存"最好的。然而,在短期你可以找到高冗余数据的目的和业务对象,似乎不值得。这尤其是如果你选择一个对象为基础的数据访问层(DAL).但是,在长期的实际支付的是:应用程序寿命周期。如图所示,这是不寻常的"数据"来自一个或多个储存系统(不限于数据库),特别是随着计算云,并且如通常情况下在分布式系统。例如,可能有一些数据,是来自一个宁静的服务,另一个大块或对象,从一个数据库,另一个从XML文件,LDAP,等等。与此实现,这意味着重要性的非常良好的封装的数据存取业务。照顾什么依赖你让(二)通过你的c-职权范围和属性。

这就是说,一个办法我一直在玩弄是把"肉"的架构中的一个业务控制器。思维的现代数据访问更多的资源比传统的思维,控器然后接受在URI或其他形式的元数据,可以用来知道是什么数据资源,它必须管理的业务对象。然后,业务对象不自己封装数据的访问;而是控制器。这让你的业务对象轻的和具体的和可以让你的控制器提供优化组合,交易的氛围,等等。注意,你的控制器,将"主机"你的商务对象的收藏,多喜欢控制器件的许多中做。

此外,还考虑了业务规则管理。如果你眯着眼睛,很难在你的UML(或模型在你的头喜欢我做的事:D)中,你将注意到你的业务规则模型,实际上是另一种模式,有时甚至是持久性的(如果使用的业务规则的引擎,例如)。我考虑让的业务控制器也实际上控制你的子系统规则也一样,让你的业务对象参照该规则通过控制器。原因是因为,不可避免的是,规则的实现往往需要执行的查找和交叉检查,以确定有效性。通常情况下,它可能需要的两个水合的业务对象查找,以及作为后端数据库中查找。考虑检测复制实体,例如,其中只有"新的",一个是水分。离开你的规则进行管理的业务控制器,然后你可以做任何你需要,而不牺牲,干净漂亮的抽象你的"域模型"。

在伪码:

using(MyConcreteBusinessContext ctx = new MyConcreteBusinessContext("datares://model1?DataSource=myserver;Catalog=mydatabase;Trusted_Connection=True ruleres://someruleresource?type=StaticRules&handler=My.Org.Business.Model.RuleManager")) {

User user = ctx.GetUserById("SZE543");
user.IsLogonActive = false;
ctx.Save();
}

//a business object
class User : BusinessBase {
  public User(BusinessContext ctx) : base(ctx) {}

  public bool Validate() {
    IValidator v = ctx.GetValidator(this);
    return v.Validate();
  }
}

// a validator
class UserValidator : BaseValidator, IValidator {
 User userInstance;
 public UserValidator(User user) {
  userInstance = user;
 }

 public bool Validate() {
   // actual validation code here
   return true;
 }
}

客户永远不应该处理与储存的对象。他们可以处理也可与检的直接,但任何对象,有任何逻辑,用于储存未被包裹在你的业务对象,不应要求通过客户直接进行。

检查了CSLA.net 通过基石就.

嗯,我在这里共同工作人员Greg提及。

格雷格说明的替代品,我们已经考虑到以极大的精确性。我只是想增加一些额外的考虑因素的情况说明。

客户代码可以被意识不到有关数据在那里的业务对象存储,但它是可能的,无论是在情况的时候只有一个数据,或者有多个datastorages于同样的业务对象的种类(用户储存在本地数据库和外部LDAP)但是客户不建立这些业务的对象。在条款的系统分析,这意味着不应有任何使用的情况下,在其存在的两个datastorages的对象相同的类型可能会影响使用情况的流动。

尽快需要区分对象创造了不同的数据库出现,客户组成部分必须意识到关于多样性数据储存在它的宇宙,而且它将不可避免地成为负责决定哪些数据存储使用上的时刻创建的对象(并且我认为对象装载从一个数据存储)。业务层可以假装这是使得这个决定,但该算法的决策将基于类型和内容的信息来自客户的组件,使客户有效地负责的决定。

这种责任可以实行在许多方式:它可以是一个连接对象的特定类型为每个数据储存;它可以segregared方法,以创建新博实例等。

问候,

迈克尔

里昂证券已经存在很长一段时间。但是我喜欢的方法,是讨论在埃里克*埃文斯的书 http://dddcommunity.org/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top