2010-01-29 44 views
3

我有一個工作一對多的關係(不bbidirectional)其中資源有一套許多分配的實施,如下所示。這個域需要做更多的分配,這些分配只需要使用AddAllocation,RemoveAllocation等來管理它。所以從對象的角度來看,我想把那些與持久相關的額外邏輯放到不同的類AllocationCollection中,並且讓這個額外的類對NHib透明。nhibernate自定義集合處理

我還想用TDD方式充實AllocationCollection的響應能力,但我不確定如何重構現有類,以便NHib仍能正常工作,明智地進行映射。你會怎麼做?

乾杯, Berryl

模型

public class Resource { 

    public virtual ICollection<Allocation> Allocations 
    { 
     get { return _allocations ?? (_allocations = new HashSet<Allocation>()); } 
     private set { _allocations = value; } // Nhib will use this 
    } 
} 

MAPPING

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ... 
<class xmlns="urn:nhibernate-mapping-2.2" name="Domain.Model.Resources.Resource, ... table="Resources"> 
.... 
<set cascade="all-delete-orphan" name="Allocations"> 
    <key foreign-key="Allocations_Resource_FK"> 
    <column name="ResourceId" /> 
    </key> 
    <one-to-many class="Model.Allocations.Allocation, ... /> 
</set> 

回答

6

比利麥卡弗蒂與NHibernate的自定義集合工作有excellent series of articles。我個人不再使用自定義集合類型。我使用AddMyType,RemoveMyType等方法控制包含集合(即聚合根)的類的集合訪問。我公開收集爲IEnumerable<MyType>。我用IEnumerable<MyType>上的擴展方法替換了其他自定義集合訪問器。

+0

比利的文章正是我一直在尋找的!我看到[Colin Jack發佈](colinjack.blogspot.com /.../ nhibernate-mapping-custom-collections.html)答覆,他以我想的方式使用自定義集合提供解決方案,但比利的解決方案使用現在,對於我來說,查詢的擴展方法對我來說是最小的入侵。謝謝! – Berryl 2010-01-29 16:52:00

+0

我同意你關於在父類中保持集合維護(添加,刪除) - 這是控制域內集合查詢的問題,不會導致父類和違反SRP,同時容易映射出來,和你的鏈接地址。 – Berryl 2010-01-29 16:56:14

+0

我幾乎完全同意使用IEnumerable並控制添加和刪除聚合根上的集合,但在時間集合(隨時間變化的事物)的情況下,我相信一個自定義時間集合會非常好。我設想做這樣的事情:contract.Rate [new DateTime(2001,01,01)]得到的速率「截至2001/01/01而不是contract.RateAsOf ...我認爲這將是很好的,因爲有您需要爲每個類的每個「時態屬性」添加很多時間行爲。 – Loudenvier 2012-07-01 15:55:10