我一直致力于我的第一个实验性DDD项目。这个项目的目的是让我对整个DDD概念有所了解。奇怪的是,正如我所读到的那样,更难的部分,我发现无处不在的语言“翻译”比整个建筑本身更容易,因此我的问题。
我只使用过去的项目L2S(Linq to SQL)。我的应用程序本身不是DDD,但它们有一个业务对象(除了linq到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中,我必须将此类分解为三个不同的查询并将它们提交到数据库中。我有一个mapper(扩展方法),让我的生活“更容易”。这样的事情。
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会为你解决所有故障(因为映射?)所以你只需要通过客户,它将完成剩下的工作。这是正确的吗?
如果我真的从中获得了巨大的好处,我愿意学习NHibernate。
感谢您查看我的问题。
编辑:你听说过Codesmithtools.com吗?他们有一个用于LinqToSql,EF,NHibernate的框架生成器。有人试过他们的NHibernate吗?我已经将PLINQO用于LinqToSql,但是它们为我认为不必要的类添加了很多垃圾。几乎所有类都适合使用,对于糟糕的程序员,作为业务类,DTO,ViewModel等等.All In One :)。可怕。但是,他们非常擅长产生这一切。我必须给他们KUDOS。答案 0 :(得分:1)
针对DDD的Linq-2-SQL NHibernate的几点:
可达性持续存在。这也可以称为级联保存,但它允许您持久保存客户实体而无需显式插入它们。这非常适合DDD,因为Customer是聚合而Address是一个值对象。在NHibernate中,值对象表示为组件映射,实体和聚合表示为类映射。聚合应该作为单个单元保持和检索,NHibernate允许你这样做。
坚持无知。 NHibernate允许您将类设计为纯POCO,而无需引用其他库。据我所知,L2S需要一个特殊的集合类型,并要求显式外键作为属性。请注意,即使使用NHibernate persistence ignorance is an ideal, not a goal。
正如其他人所指出的,NHibernate的学习曲线陡峭。例如,lazy loading can be problematic。但这总体上是值得的。
答案 1 :(得分:0)
你的问题是开放式的。很明显,你现在如何使用Linq-2-SQL。正如第一条评论所说:是的NHibernate可以提供级联保存。但这只是一个开始......首先,请检查这个问题和答案(有不止一个有趣的):
我在私人项目中使用NHibernate
作为首选。如果可能的话,我更喜欢任何项目。但是,我想从我的经验中再添加一个 NOTE :
最大的好处是,一旦您学习并使用NHibernate
,使用其他 ORM 工具就不那么困难了。在某些项目中,您将(我确实)在某些LLBL生成器上遇到实体框架......和(虽然我们可以归咎于与NHibernate
比较的内容缺失;)我们可以快速完成:
希望NHibernate
有所帮助,祝你好运。学习曲线可能比预期的要慢,但效益等待。