2009-11-25 26 views
3

我想知道在類中公開集合的建議方式是什麼,以及與使用NHibernate實體時做同樣的事情的方式有什麼不同。爲保護處理類和NHibernate實體中的集合屬性

IList<SomeObjType> MyProperty { get; set; } 

具有調節器或私人給我一些時間,我多麼希望更多的控制:

讓我解釋一下......我從來沒有與我的班暴露集合屬性就像一個特定的問題處理收集。 我最近碰到這篇文章就由戴維奧比昂:

http://davybrion.com/blog/2009/10/stop-exposing-collections-already/

戴維,明確建議有收藏作爲IEnumerables,而不是讓說名單,以禁止其直接操縱這些內容的選項的用戶集合。我可以理解他的觀點,但我並不完全相信,通過閱讀他的文章中的評論,我不是唯一的評論。

當談到NHibernate的實體時,按照他提出的方式隱藏集合是非常有意義的,尤其是當級聯存在時。我想要完全控制會話及其集合中的實體,並且爲集合屬性公開AddXxx和RemoveXxx對我來說更有意義。

問題是怎麼做到的?

如果我有實體的集合作爲IEnumerables我沒有辦法添加/刪除元素,而沒有將它們轉換爲列表ToList()這使得一個新的列表,因此什麼都不能持久化或將它們轉換爲列表由於代理和延遲加載,這是一種痛苦。

的總體思路是不允許被檢索的實體,並已其收藏操縱(add.remove元素)直接而只能通過我同時履行收集持久性級聯公開的方法。

您的建議和想法將不勝感激。

回答

7

......怎麼

private IList<string> _mappedProperty; 

public IEnumerable<string> ExposedProperty 
{ 
    get { return _mappedProperty.AsEnumerable<string>(); } 
} 

public void Add(string value) 
{ 
    // Apply business rules, raise events, queue message, etc. 
    _mappedProperty.Add(value); 
} 

該解決方案是可行的。 _mappedProperty。您可以在訪問和命名策略文檔here中閱讀有關如何執行此操作的更多信息。

實際上,我更喜歡映射我所有的類。開發者最好決定如何定義類的公共接口,而不是ORM。

+3

你不需要AsEnumerable ,IList 已經實現IEnumerable

+0

這很有道理。我意識到並建議其他人將私人財產映射到NHinernate,但從未設法爲此案件建立聯繫。謝謝。 – tolism7

0

如何將它們公開爲ReadOnlyCollection?

IList<SomeObjType> _mappedProperty; 

return new ReadOnlyCollection<SomeObjType> ExposedProperty 
{ 
    get 
    { 
    return new ReadOnlyCollection(_mappedProperty); 
    } 
} 
+0

ReadOnlyCollection是我想到的一個選項,它可以在非NHibernate上下文中很好地工作。在與NHibernate一起使用時,我遇到了映射問題,因爲它需要映射一個分離的私有字段,該字段必須在構建ReadOnlyCollection屬性時被初始化,並且我正在尋找一個模板的實踐替代方案。儘管謝謝你的回答! – tolism7

0

我使用的是NHibernate,我通常將集合保存爲ISet並使setter受保護。

ISet<SomeObjType> MyProperty { get; protected set; } 

我還在需要它們的集合屬性中提供了AddXxx和RemoveXxx。大部分時間這對我來說都非常滿意。但我會說,有些情況下允許客戶端代碼直接添加項目到集合中是有意義的。

基本上,我看到的是,如果我在客戶端代碼中遵循"Tell, Don't Ask"的原則,而不必擔心在我的域對象屬性上實施嚴格的訪問限制,那麼我總是會得到一個好的設計。如果你使用NHibernate的映射到私人領域,即

+0

謝謝你的回答Rohit。正如我在我的問題中提到的,我也使得setter在大部分時間都受到保護,但是不會禁止使用collection的客戶端代碼直接在AddXxx/RemoveXxx方法中繞過邏輯來添加/刪除元素。受保護僅防止客戶端代碼完全覆蓋整個系列。 – tolism7

相關問題