2

NHibernate에서 도메인 모델을 매핑하려고합니다. 도메인 모델은 DDD 스타일이라고 생각하는 것으로 구현됩니다. 매핑은 주로 작동하지만 컬렉션에 컬렉션 필터를 사용하려고하면 다음과 같은 예외가 발생합니다. 컬렉션이 참조되지 않았습니다.NHibernate 컬렉션 필터를 DDD 컬렉션과 함께 사용하기

문제는 내가 컬렉션을 구현 한 방법에서 비롯된 것임을 알고 있습니다. 내 질문 :이 방법으로 구현 된 컬렉션에 nHibernate에서 컬렉션 필터를 사용할 수 있습니까, 아니면 그냥 잊어 버려야합니다. 즉 nHibernate가이 필터를 사용할 수 없습니다.

Person 
{ 
    IList<Address> _addresses = new List<Address>(); 
    public string FirstName {get; set;} 
    ... 
    public void addAddress(Address address) 
    { 
     // ... do some checks or validation 
     _addresses.Add(address); 
    } 

    public void removeAddress(Address address) {...} 

    public ReadOnlyCollection<Address> Addresses 
    { 
     get { return new ReadOnlyCollection<Address>(_addresses); } 
    } 
} 

주요 문제는 내가 공개적으로 내부 주소 수집을 노출하지 않는 것이 다음과 같이

코드입니다. 다른 모든 것은 작동합니다. nHibernate가 필드와 직접 상호 작용할 수 있도록 field.camelcase-underscore 액세스를 사용합니다. 나는 Hibernate in Action 책을 통해 작업 해왔다. 이제는 7 장에서 컬렉션 필터를 다룰 것이다.

이 문제를 해결할 방법이 있습니까? 다음과 같이 내부 컬렉션을 노출하여 작동하도록했습니다.

public ReadOnlyCollection<Address> Addresses 
{ 
    get { return _addresses; } 
} 

하지만 실제로이 작업을 수행하고 싶지 않습니다.

도움말 정말 감사하겠습니다. JIDE

답변

0

내가 올바르게 기억 - NHibernate에 필터를 DB에서 반환 된 행을 줄이기 위해 SQL 쿼리 등의 추가 절을 사용할 수 있습니다.

내 질문에 당신은 - 왜 그게 필요합니까?
즉, 한 사람이 얼마나 많은 주소를 가지고있을 수 있습니까? 1? 5? 10? 수집 분리에 대해


...

나 자신 단지 (단지 인수없는 ctor에의와 "virtual`ity"같은) NHibernate에 대한 희생으로 동의하고 개인 세터로 (사방은 IList 노출 사용하십시오) 단지 기술적 인 복잡성을 줄이기 위해. 그들의 내용은 분명히 외부에서 수정할 수 있지만, 나는 그렇게하지 않습니다.

코드를 매우 안전하게 만드는 것보다 쉽게 ​​이해할 수 있도록하는 것이 더 중요합니다. 안전이 따릅니다.

+0

IList를 노출하는 경우 소비자가 직접 컬렉션을 수정하도록 어떻게 처리합니까? 필자가 잘 알고있는 것은 양방향 관계를 처리 할 수 ​​있도록 도우미 메서드를 만드는 것이 가장 좋습니다. –

+0

@ 마이크 나는 그것을 다루지 않는다. 그게 내가 희생으로 의미했던 것입니다. 나는 단지 그렇게하지 않는 대회를 만들고있다. 당신이 소비자에 대한 통제권을 가지고 있지 않다면 작동하지 않을 수도 있습니다. (저에게 쉬운 일입니다 - 제 프로젝트에 팀이 없어도 혼자였습니다). 양방향 관계를 처리하는 도우미 메서드로 무엇을 의미합니까? –

+0

@Mike 어떻게 사생활 보호 컬렉션을 수정하고 반영하는 것이 좋을까요? :) –

관련 문제