2010-08-19 19 views
2

我們在我們的領域模型中使用nHibernate,並希望創建DTO以通過WCF將對象發送到使用MVVM模式(WPF/WinForms)製作的前端應用程序。我們完全控制了客戶端和服務器 - 並且兩者都同時升級,因此版本控制/跨平臺不是問題。使用nHibernate實體和DTO發送網格數據

我看到如何編輯單個條目,但我仍然不確定通過線路發送對象集合的最佳方式。然後DTO用於填充網格,可以更新,刪除或添加行。

我的問題是;使用DTO和nHibernate在網格/表格類似的場景中捕獲插入,更新和刪除的最佳方法是什麼?

謝謝。 (我們的應用程序最初使用DataTables,其中DataTable/DataRow跟蹤修改並使用GetChanges/Merge,您可以通過線路傳輸僅修改和需要更新的內容 - 插入和刪除的位置也可以很好地跟蹤)

+0

將DTO封裝在狀態包裝器/代理中是一種解決方案 - STE(狀態跟蹤實體)。我看到這是Entity Framework所做的 - 這將是一個有趣的解決方案。不知道有什麼人想到它 - 使用nHibernate作爲ORM服務器端,但實體框架的客戶端狀態跟蹤... – Thies 2010-08-26 10:43:33

回答

0

你需要綁定到BindingSource的如:

dataGridView1.DataSource = _presenter.BindingSource; 

你也有你自己的某種查看和主持人之間的接口。

在您的演示者中,您將返回一個IList<NHibernateResult>,其中NHibernateResult是包含您想要返回的屬性的所有吸氣劑和吸氣劑的類。它可以是具有有限屬性(如列)或實體類的自定義類。 NHibernateResult不是一個實際的類,只是這個答案的佔位符。

例如(在演示者),

private IList<OrdersResult> _bindingSource; 

     public IList<OrdersResult> BindingSource 
     { 
      get 
      { 
       //_bindingSource = OrderDataControl.Instance.GetAll(); 
       _bindingSource = 
        OrderDataControl.Instance.GetSimpleOrderList(_firstResult, _maxResult); 
       return _bindingSource; 
      } 

      set 
      { 
       _bindingSource = value; 
      } 
     } 

OrderDataControl是一個數據訪問對象或數據傳輸對象。它與你的SessionProvider和Respository(aka Model)進行交互。

這種抽象級別會從您的演示者中刪除數據層,並使您的視圖對模型完全愚蠢。它將您的視圖降級爲僅與UI相關的事件,如啓用,可見,顏色等。

+0

#OAOD謝謝你的回覆,但是我不明白bindSource如何幫助保持跟蹤對集合的修改。也就是說,如果修改了IList,我仍然需要將完整列表發送回服務器 - 使用DTO重新獲取實體併合並DTO中的更改(或更新列表中的所有實體)。由於刪除的項目不再在列表中,我需要對它們進行特殊處理。 – Thies 2010-08-20 07:06:54

1

我很可能會發送一個容器類,其中包含新的和更新的實例以及要刪除的項目。

例如:

class GridModificationsDto 
{ 
    Dto[] NewOrUpdatedItems { get; set; } 
    Identity[] DeletedItems { get; set; } 
} 

當一個項目是新的,它不會有一個id。你也可以有一個單獨的新項目清單。

然後,你需要做這樣的事情:

foreach(Dto dto in modifications.NewOrUpdatedItems) 
{ 
    if (dto.id == 0) 
    { 
    session.Save(DtoMapper.CreateEntity(dto)); 
    } 
    else 
    { 
    Entity entity = session.Get<Entity>(dto.id); 
    DtoMapper.Update(entity, dto); 
    } 
} 

foreach(Identity identity in modifications.DeletedItems) 
{ 
    session.Delete<Entity>(identity.id); 
} 

我不知道你怎麼能獲得在UI修改的項目清單。我認爲這可以通過數據綁定和PropertyChanged事件以及類似的東西來實現。如果沒有任何用處,您可能需要繼承自己的網格控件。