2012-11-13 55 views
0

我一直在做我的第一個實驗DDD項目。這個項目的目標是讓我感受到整個DDD概念。奇怪的是,正如我已經讀過這是更困難的部分,我發現無處不在的語言「翻譯」比整個建築本身更容易,因此我的問題。DDD與L2S或NHibernate ...關於堅持業務對象的數據

我只用於我以前的項目L2S(Linq to SQL)。我的應用程序本身不是DDD,但它們確實有一個Business Object(除了那些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?我已經使用PLINQO來處理LinqToSql,但是他們爲我認爲不需要的類添加了太多垃圾。幾乎適合使用的類,適用於不好的程序員,作爲商業類,DTO,ViewModels等All In One :)。可怕。但是,他們非常擅長產生這一切。我必須爲他們提供KUDOS。

+3

是的,您只需保存客戶,然後NHibernate即可查看發票和其他實體已更改,並將爲您保存。當你不熟悉NHibernate時,有一個陡峭的學習曲線可以讓你的工作有效,但在那之後它是非常有價值的。 –

+0

謝謝傑克。我正在研究一些教程。我對流利的nhibernate和nhibernate以及nhibernate MBC感到困惑?哪一個是我認爲你需要的? –

+0

我只使用普通的舊NHibernate自己。發現流利NHibernate非常好,但我開發的服務失敗,因爲流利的NHibernate花了這麼長的時間來創建配置。那是幾年前,我確信自那以後事情已經發生了變化。沒有聽說過NHibernate的MBC,所以不能對此發表評論。如果我現在開始一個綠色領域項目,我會從流利的NHIbernate開始。如果需要,不難遷移到普通的NHibernate XML配置。 –

回答

0

你的問題是開放式的。很明顯,你現在已經是Linq-2-SQL的工作原理了。正如第一條評論所說:是的NHibernate可以提供級聯保存。但是,這僅僅是個開始......請首先檢查這個問題和答案(有超過一個有趣):

NHibernate vs LINQ to SQL

我使用我的私人項目NHibernate作爲第一選擇。如果可能,我更喜歡它在任何項目上。但是,我想追加一個更注:,從我的經歷中:

最大的好處是,一旦你將學習與工作NHibernate,它不會那麼多很難與其他ORM工作工具。在某些項目中,您(我曾經)在某些LLBL生成器上遇到Entity Framework ...和(雖然我們可以責怪的東西在comparsion與NHibernate缺失;)我們可以迅速:

  • 瞭解域,因爲ORM迫使實體/域驅動的實現
  • 使用標準模式

祝願它有所幫助,祝你好運NHibernate。學習曲線可能比預期的要慢,但好處在等待。

+0

謝謝Radim。我已經閱讀過那篇文章。現在的問題是,在閱讀了關於流利NHibernate,NHibernate MBC ......這是哪個?或者,哪一個是最好的。由於它是開源的,我猜這裏有多種變種。 –

+0

是的;)這是一個很好的問題。我試圖儘可能使用默認分配。例如。 XML映射,Criteria語言,強大的QueryOver。對於自定義需求,我們使用擴展點(並且有很多類似事件監聽器)。但是我從來沒有發現使用像流利映射,LINQ提供者這樣的插件是有用的......因爲所有這些都是建立在NHibernate之上的,試圖隱藏NHibernate的一些困難 - 但很難說是否滿足了。所以我個人建議從默認開始。 –

+0

@Tony看到http://stackoverflow.com/a/8294639/671619約FluentNH一些事實VS MBC – Firo

1

一些過度的Linq-2-SQL DDD爲NHibernate的要點:

  • 持久性的可達性。這也可以稱爲級聯保存,但它可以讓您堅持客戶實體而不必顯式插入它們。這與DDD非常吻合,因爲Customer將是一個聚合,Address則是一個值對象。在NHibernate中,值對象表示爲組件映射和實體,並將聚合表示爲類映射。聚合應該作爲單個單元被持久化和檢索,NHibernate允許你這樣做。

  • 持續性無知。 NHibernate允許你將你的類設計爲純POCO,而不需要引用額外的庫。據我所知,L2S需要一個特殊類型的集合,並且需要明確的外鍵作爲屬性。請注意,即使使用NHibernate persistence ignorance is an ideal, not a goal

正如其他人指出的那樣,NHibernate有一個陡峭的學習曲線。例如,lazy loading can be problematic。但它總體上是值得的。