0

我一直在从事我的第一个实验性 DDD 项目。这个项目的目的是让我对整个 DDD 概念有一个感觉。奇怪的是,正如我所读的那样,它是更困难的部分,我发现无处不在的语言“翻译”比整个架构本身更容易,因此我的问题是。

我只在我过去的项目中使用过 L2S(Linq to SQL)。我的应用程序本身不是 DDD,但它们确实有一个业务对象(除了 linq to sql 生成的那些),我有一个用于该对象的存储库。例如,

public class Customer
    {
       public ID {get; set;}
       public string Fullname {get; set;}
       public Address address {get; set;}
       public List<Invoices> invoices {get; set;}
    }

现在,在 L2S 中,我必须将这个类分解为三个不同的查询并将它们提交到数据库中。我有一个映射器(扩展方法)让我的生活“更轻松”。像这样的东西。

public void AddCustomer(Customer customer)
{
// This customer i am passing is the business object
// For the sake of demo, i am going to avoid the whole attach(), check for ID, etc.
// I think you are going to get what i am trying to do here.

using{ var context = new L2SContext())
{
context.CustomerEntity.InsertOnSubmit(customer.ToEntity());
context.AddressEntity.InsertOnSubmit(customer.Address.ToEntity());
context.InvoicesEntity.InsertAllOnSubmit(customer.Invoices.ToEntity());
}
}

行。后来我在上下文中有一个 SubmitChanges() 方法,我实际上将数据保存到数据库中。

现在,我对 NHibernate 知之甚少,几乎一无所知。但是看看一些例子,我怀疑 NHibernate 会为你处理所有的故障(因为映射?)所以你只需要传递 Customer,它会做剩下的事情。那是对的吗?

如果我真的从中受益匪浅,我愿意学习 NHibernate。

感谢您查看我的问题。

编辑:你听说过 Codesmithtools.com 吗?他们有一个用于 LinqToSql、EF、NHibernate 的框架生成器。有人试过他们的 NHibernate 吗?我已经为 LinqToSql 使用了 PLINQO,但是它们给我认为不必要的类添加了很多废话。几乎这些类都适合用于糟糕的程序员,如业务类、DTO、ViewModels 等。多合一 :)。糟糕的。但是,他们真的很擅长生成所有这些。我必须为此给予他们 KUDOS。

4

2 回答 2

1

NHibernate over Linq-2-SQL for DDD 的几点:

  • 通过可达性实现持久性。这也可以称为级联保存,但它允许您保留客户实体而无需显式插入它们。这非常适合 DDD,因为 Customer 将是一个聚合,而 Address 将是一个值对象。在 NHibernate 中,值对象表示为组件映射,实体和聚合表示为类映射。聚合应该作为单个单元进行持久化和检索,NHibernate 允许您这样做。

  • 执着无知。NHibernate 允许您将您的类设计为纯 POCO,而无需引用其他库。据我所知,L2S 需要一个特殊的集合类型,并且需要明确的外键作为属性。请注意,即使使用 NHibernate持久性无知也是一种理想,而不是目标

正如其他人所指出的,NHibernate 有一个陡峭的学习曲线。例如,延迟加载可能会出现问题。但总的来说还是值得的。

于 2012-11-13T20:13:13.440 回答
0

你的问题是开放式的。很明显,您现在了解 Linq-2-SQL 的工作原理。正如第一条评论所说:是的,NHibernate 可以提供级联保存。但这只是开始……请首先检查这个问题和答案(有趣的不止一个):

NHibernate 与 LINQ to SQL

NHibernate在我的私人项目中使用作为第一选择。如果可能的话,我更喜欢在任何项目中使用它。但是,我想根据我的经验再添加一个NOTE

最大的好处是,一旦您学习并使用了,使用其他ORM工具NHibernate就不会那么困难了。在某些项目中,您将(我确实)在某些 LLBL 生成器上遇到实体框架......,并且(虽然我们可以责怪与之相比缺少某些东西;)我们可以快速:NHibernate

  • 了解领域,因为ORM强制实体/领域驱动的实现
  • 使用标准模式

希望它有所帮助并祝你好运NHibernate。学习曲线可能比预期的要慢,但好处等待着。

于 2012-11-13T17:06:51.733 回答