2009-11-12 31 views
1

我必须建立在我建立的大多数“获取”方法遗留系统之上的复杂的域模型 - 通常只是通过传递数据库主密钥ID。很简单。我现在好奇如何处理在数据库中创建新对象的任务,并用新数据保存现有对象,并且希望确保覆盖我的所有基础。面向对象的设计:保存复杂的对象

对应的实体在数据库中数约20-25整个项目的主要领域对象。大约需要保存10个左右(其余的仅用于支持数据,不需要用户更新)。要保存的对象具有复杂的依赖关系 - 对象A具有包含对象C,D和E的对象B的列表,例如,当原始对象A为时,可能需要保存所有对象。

我想构建它,以便UI开发人员可以轻松使用它,但也强制只保存有效数据(假设对象B无法保存,除非对象C处于有效状态)。这让我害怕让他们从头开始创建一个对象并尝试保存它 - 我想遵循这样的原则,即对象应该始终处于有效状态。

另一种方法是暴露“CreateNew”并就处理它们的服务对象“保存”的方法,但参数列表这样的方法将是令人震惊的。

我想需要“CreateNew”和“保存”接受类似的命令对象,他们可以创建和传递,让他们知道需要的数据到底是什么,什么不能试图控制的。我读了command pattern,但我不需要它提供的任何主要特权。

我需要考虑哪些因素才能决定采用哪种方法?这是C#3.5,如果这个因素进入它的话。

回答

1

你可以让你的对象都暴露出同样的方法,把它AttemptSave,并调用父对象上此方法将导致其级联呼吁所有儿童的那些方法。

该方法可以返回一个布尔值,指示操作成功。不需要抛出异常来让UI开发人员变得容易。

然后暴露一个方法GetValidationErrors。如果AttemptSave返回false,那么UI开发人员应该调用此方法来检索并显示错误。

或者,您可以添加一个验证方法验证它将预先检查对象层次结构。您可以通过GetValidationErrors返回验证错误。然后对AttemptSave的调用将被执行。如果失败,您可以使用GetOperationErrors返回错误。

SQL哲学中的某些东西。无论您的查询是否成功,您都可以查看@@ ROWCOUNT以了解查询是否至少完成了部分工作。

1

你应该研究.NET的流行的对象关系映射框架。以前很多人已经解决了这个问题,一些最聪明的人已经和我们分享了他们的劳动成果。他们有很多功能,最受欢迎的功能都经过了严格的测试。

每隔几天,现在看来,新的人询问.NET ORM的建议,所以有大量的堆栈溢出主题,以帮助指导你。例如:

(如果你在 'ORM' 和 '.NET' 搜索,你转了很多很多的比赛。)

在典型的用法中,UI开发人员只处理高级父对象(在域驱动设计语言中称为“聚合根”)。他们使用ORM作为Repository,它确保给定Save中的所有操作都捆绑在一起进行合理的事务处理。 (您仍然需要强制执行每个业务规则的有效性在你的域对象。)

这里是什么UI代码将看起来像一个简化的外观:

// Given an IRepository implemented by your ORM, 
ICustomer customer = repository.Get(customerId); 

// ... do stuff to customer and its child objects ... 

repository.Save(customer); 
+0

我想过检查出来,但问题出现了与“遗留系统”部分:尽管我可以随意从数据库读取数据,但在恢复时必须通过Web服务。不幸的是,它不能直接写入数据库。 – Chris 2009-11-12 17:32:01

+0

嗯,不幸。我没有任何经验,虽然有人在这里问了一个关于它的问题,这可能很有趣:http://stackoverflow.com/questions/1202178/incorporating-orm-into-a-semi-soa-architecture。 – 2009-11-12 17:35:37

+0

不错的发现,一直在寻找这样的链接。谢谢! – Chris 2009-11-12 17:44:31