2010-01-29 5 views
3

나는 일대일 관계가있다 (양방향이 아님). 여기서는 Resource가 많은 할당 집합을 암시하며, 아래에 표시된 것과 같다. 도메인은 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 
    } 
} 

매핑

<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

빌리 퍼티 (McCafferty)는 자 NHibernate에서 사용자 지정 컬렉션 작업상의 excellent series of articles 있습니다. 개인적으로 나는 더 이상 사용자 지정 컬렉션 형식을 사용하지 않습니다. AddMyType, RemoveMyType 등의 메소드를 사용하여 컬렉션 (즉, 집계 루트)을 포함하는 클래스에서 컬렉션 액세스를 제어합니다. 컬렉션을 IEnumerable<MyType>으로 공개합니다. IEnumerable<MyType>의 확장 메서드를 사용하여 다른 사용자 지정 컬렉션 접근자를 대체했습니다.

+0

빌리의 기사가 내가 찾고있는 기사였습니다! 콜린 잭 (colinjack.blogspot.com /.../ nhibernate-mapping-custom-collections.html)이 자신이 생각한대로 사용자 정의 컬렉션을 사용하는 솔루션을 제공하는 회신을 보았습니다.하지만 빌리의 솔루션은 quering에 대한 확장 방법은 지금 당장은 가장 침해 적이 지 않습니다. 감사! – Berryl

+0

부모 클래스에서 컬렉션 유지 관리 (추가, 제거)를 유지하는 것에 동의합니다. 상위 클래스와 위반 SRP를 부풀리지 않고 도메인 내에서 수집 쿼리를 제어하는 ​​문제입니다. 그리고 귀하의 링크 주소. – Berryl

+0

나는 IEnumerable을 사용하고 집계 루트의 컬렉션에서 추가 및 제거하는 것에 거의 동의하지만 임시 컬렉션 (시간이 지남에 따라 변하는 것)의 경우 사용자 지정 임시 컬렉션이 매우 훌륭하다고 생각합니다. 나는 contract.Rate [new DateTime (2001,01,01)]과 같은 것을하는 것을 상상한다. contract 대신에 2001/01/01 시점에서 rate를 얻는다 .RateAsOf ... 나는 그것이있을 것이므로 좋을 것이라고 생각한다. 모든 클래스에서 각 "일시적인 속성 (ies)"에 대해 추가해야하는 많은 일시적인 동작입니다. – Loudenvier

관련 문제