这是可能的(甚至是可能的),我只是不完全所著的Grokking一个概念“工作单位”。基本上,我看到它作为排序在一个面向对象的环境中使用的广义的交易。开始工作的单位,进行交互的对象,提交或回滚。但这是如何分解到这些对象背后的数据存储?

实际成交

在具有单个DB和ORM(如NHibernate的)的系统中它很容易。该交易可以通过ORM来维持。但是关于在自定义的域模型模糊许多不同的数据源的系统是什么?而且也不是所有的这些数据源是关系数据库? (有文件系统上完成这里围了不少。)

现在我卡上的想法,“你根本无法维持跨SQL2005数据库,一个SQL2000数据库,一个DB2数据库和文件系统都在同一个‘原子’经营事务。”所以现在它的开发人员团队(通常谁相互独立的工作)手动维护代码事务的责任。每个数据库可以有它正确的交易,但经营作为一个整体人工检查和平衡的每一步显著

然而,在域和标准显影剂周转增加的复杂性,这种方法将变得越来越困难和容易出错的随时间。

没有任何人有这样的实力最好的解决,或者它是如何被一个域名如何解决之前任何意见或例子吗?在这种情况下,实际的“域”仍然是非常处于起步阶段,演变为原型有一天扩大和消费/替换大生态系统的不同的遗留应用程序。因此,有足够的空间,重新设计和重新分解。

有关参考,我目前目标为与设计的一个10000英尺的观点是:一个大集合的小哑-AS-可能客户端应用程序调用一个中央基于消息的服务。该服务的入口进入“域核心”,可以作为一个大的MVC风格的应用程序被认为是。请求到服务(很像“行动”),这是由处理器拾起(很像“控制器”)制成。任何程序去那里。他们用这些模型,其中包含所有业务规则进行交互。该模型与存储库(数据库X,数据库Y,文件系统,电子邮件,任何外部资源)的交互事件发布,听众(“服务”?这一部分仍然是在设计和需要改进多云)拿起与使用。所有欢快相应依赖性注入。

对不起,所有的冗长:)但是,如果任何人有任何建议,我很乐意听到它。甚至(尤其是)如果该建议是“你的设计不好,试试这个,而不是...”谢谢!

有帮助吗?

解决方案

我以前工作过,可以做到这一点的系统上,它是相当简单的。既然你的项目是在其早期阶段,也许这可能是对您有用的信息。不幸的是,我不再有访问代码,但我还是在描述它是如何工作的舒适。

我做了什么,用一个通用的存储库模式的实现建立我的资料库。该基地库类型将始终是由服务和UOW引用。为了讨论方便,我们将其称之为BaseRepository。 “T”将限于IEntity实施方式中,其中表示的域对象。从BaseRepository,我已经创建了另一个基类集用于合成,如SqlBaseRepository,XmlBaseRepository等

在UOW只关心的东西是类型BaseRepository,这是在核心功能将存在的。基本CUD(的CRUD)将被表示为,创建,更新和删除提供的等同物。各有什么这些会做将创建一个委托,并将其放置在里面UOW队列,也随之关于它打算什么类型的交易是,并且完成它需要相应的数据信息传递。该UOW将开始保持什么库会要参与交易的名单,但仍然没有在意什么类型它。 Effictively,这里排队是像在事务中征募。

在BaseRepository()定义称为像.ApplyChange的抽象方法。一旦.Commit()被调用的UOW,它会创建一个TransactionScope(),并开始调用列表中的delagates,回传信息.ApplyChange()。 .ApplyChange()的实际实现存在于特定存储库的基础上,即SqlRepositoryBase等,并且可以通过执行覆盖,以及

凡至少有猫腻,对我来说,是回滚。我只涉及一个单一的数据库,但有时不得不所做的基于文件的变化。我添加了一个.RevertChange()方法和开始追踪原始状态和改性状态,这样我可以基本上施加反向-Δ要回我在哪里的文件堆栈上。

我希望我能上实施更具体的,但它已经过了一年,因为我已经看到的代码。我可以告诉你,对原始代码的基础上,从书中承担, .NET结构域驱动设计与C#:问题 - 设计 - 解决方案,由蒂姆·麦卡锡。大量的我的仓库实现的是基于他的例子,以大多数我的定制中的UoWs及其实施来了。

我希望帮助,有点! : - )

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