2011-10-19 2 views
1

으로 ORMs는 종종지도 일대 등 관계 :저장소 패턴, ORMS 및 getter 및 setter

class Parent { 
    IList<Child> Children { get; set; } 
} 

문제는 저장소에, 당신이 할 수 있다는 것이다 :

GetChildrenOfParent(int parentID) { 
    from c in Children... 

    return children; 
} 

이제 자녀를 "데려다 줄"장소가 두 곳 있습니다. 당신은 어쩌면 단지 아이들이 누가 삭제 된 플래그가없는 반환과 같은 무언가를 추가 할 때, 당신은 할 수 있습니다

GetChildrenOfParent(int parentID) { 
    from c in Children.. 
    where not deleted 

    return children; 
} 

또는

class Parent { 
    IList<Child> Children { get .... only get not deleted children; set; } 
} 

당신은 내가에서 얻고 무엇을 볼 수 있습니까? 이제 getter 루틴을 수행 할 두 곳을 선택할 수 있습니다. 이 루틴을 가지고 논리적 장소가 저장소에있는 것 같다, 아직는 것을 의미한다 :

foreach (var child in parent.Children) 

은 더 이상 당신의 "게터"을 통해 ORM이 일대를 갖는 따라서 모든 생각을 않을 것입니다 이 방법으로 매핑 된 것은 잘못된 것 같습니다.

답변

0

나는 당신의 질문이 무엇인지는 모르겠지만 그것이 어디에 잘못되었는지는 정말로 알지 못합니다. 그것은 선택의 여지가 IMO 설계 내려 온다. 각 엔티티에서 계층 적 데이터 (하위 엔티티)에 액세스 하시겠습니까? 그렇게하고 초기 페치에서 데이터를로드하려는 경우 하나를 여러 개 활용하면 시간을 절약 할 수 있습니다 (미리로드하거나 느슨하게로드 할 수 있음). 이 경우 첫 번째 예제에서 데이터를 가져 오는 것이 좋습니다. 당신은 '비 삭제'결과 또는 '당신이 필요로하는 어떤 필터'과 같이 다시 가져 오는 데이터를 필터링하는 LINQ를 사용할 수 있습니다 내가 사용하고 때 개인적으로

IList<Child> list = parent.Children.Where(x => x.Deleted == false); 

을, 나는 깨끗하게 유지하기 위해 좋아하고 저장소 패턴 (나는 최근에 ActiveRecord 패턴의 큰 팬이되고있다). 나는 이것을 자신의 메소드 호출로 분리하는 것을 선호한다. 리포지토리 호출을 속성 이름 children에 추가 할 수는 있지만 나에게는 모델을 가질 때와 그 모델을 hyrdating 할 때의 경계를 넘는 것처럼 느껴집니다.

그런 식으로하면 기본 필터링이나 어리석은 묶음 또는 과부하를 수행하여 '삭제되었거나 삭제되었습니다'또는 '남성 또는 여성'이라고 선택하거나 그냥 '삭제 또는 삭제'합니다.

내가 말했듯이, 그것은 선택의 여지가있다. 어떻게 앱을 키우고 싶습니까? 저장소에서 어리석은 오버로드 목록을 작성한다고 생각하면 미래의 코드 작성자가 코드를 이해하고 관리 할 코드가 적어지며 코드를 이해하지 못하게 할 수 있습니다. 성능을 방해합니다 (또는 성능이 이상적으로 향상됩니다). 어떤 경우에 테스트를하면 코드를 위반하지 않고도 리팩터링에 도움이됩니다.

'올바르다'거나 '잘못된'일을하지 마십시오.

+0

만약 당신이 list = parent.children.where를한다면 ... 당신은 당신의 예에서 사용했습니다. 당신이이 곳 곳곳에 수백 개의 전화를 가지고있을 때 어떤 일이 일어날 지 상상해보십시오. 그리고 이제 그것을 x.deleted && x.age <18. 게터 또는 저장소 메소드의 요점은 한 곳에서만 변경하고 계약을 파기하지 않는다는 것입니다. – BobTurbo

+0

정확하게, 그래서 내가 깨끗하게 유지하고 자신의 저장소 방법에 넣어 선호했다. 내가 무엇을 요구하고 있는지 정말로 모르겠지만 원래의 조언으로 돌아가서, 당신과 당신의 응용에 맞는 것을 선택하십시오. 당신의 '베스트 프랙티스'에 대한 당신의 해석은 무엇을 의미합니까? 너는 '맞다'또는 '틀렸다'.개인적인 경험에 비추어 볼 때 '옳은'또는 '잘못 된'것으로 간주되는 것에 엄격히 부합하려고 노력하는 것은 주요한 진도를 늦추거나 과부하로 코드를 부 풀리는 결과를 낳습니다. – lloydphillips

+0

필터링 된 쿼리를 두 곳 이상에서 사용해야하는 경우 코드 유지 관리에 도움이되는 특정 메서드를 만드는 것이 좋습니다. 수업에서 해당 결과에 대한 속성에 액세스했는지 여부는 도메인 모델링 방법에 대한 개인적인 선택에 달려 있습니다. – lloydphillips