2009-10-15 4 views
3

내 도메인 모델에있는 모든 엔티티를 INotifyPropertyChanged으로 구현할 생각입니다.왜 내 도메인 개체가 INotifyPropertyChanged를 구현해야하는 단점이 있습니까?

도메인에서 일부 엔티티가 변경되면 프리젠 테이션 레이어가 즉시이를 인식하고 이에 따라 변경됩니다 (MVPVM 패턴을 구현하려고하는데 프리젠 테이션 객체가 도메인과 동일하지 않음). 사물). 나는 나를 더 쉽게 만들어야한다고 생각한다.

단점은 무엇이라고 생각하십니까?

답변

5

도메인 모델은 주로 도메인을 모델링해야하므로 그 기본 책임이 있습니다. Arnis L.이 또 다른 대답으로 제시 한 것처럼, 도메인 모델은 프레젠테이션 레이어를 포함해서는 안되며, 나는 동의 할 수밖에 없습니다.

그러나 실용적으로 INOTifyPropertyChanged (INPC)는 사용 가능한보다 나은 인터페이스 중 하나라고 생각합니다. 주요 목적은 UI 프레임 워크 (Windows Forms와 WPF 모두 사용)를 지원하는 것이지만 주로 신호 ​​메커니즘입니다. 그것을 구현하는 데 관련된 작업의 양은 별개이지만 많은 해를 끼치 지 않습니다.

기본적으로 도메인 개체에 구현하지는 않겠지 만 (일부 경우에는 내 View Models에서 요구하는) 신호 메커니즘이 필요하기 때문에 주저하지 않을 것입니다. 결국, SRP가 클래스가 단 하나의 책임만을 가져야한다고 언급하더라도, 그러한 클래스는 여전히 태스크에 가장 적합한 유형입니다. 다른 클래스는 상태가 클래스 자체보다 변할 때 더 잘 알지 못합니다.

도메인 모델에 신호 메커니즘이 필요하다면 INPC를 구현하십시오. 새로운 것을 발명 할 이유가 없습니다. 인터페이스는 System.ComponentModel에 정의되어 있으므로 특정 UI 프레임 워크에 묶여 있지 않다는 것을 알 수 있습니다.

INPC 구현의 주된 단점은 관련된 작업의 양이므로 필요한 경우에만 구현합니다.

+0

나중에 - 무수한 'Serializable'속성, 코드 액세스 보안 관련 항목을 추가하고 제 3 자 인터페이스를 구현 한 다음 너무 늦을 것입니다 - 진흙 투성이입니다. 어쨌든 - 행운을 빌어 요. :) –

+0

마크와 동의해야합니다. INotifyPropertyChanged는 UI 바인딩에 많이 사용되지만 어떤 경우에는 도메인 이벤트를 감지하는 데 사용할 수 있습니다. 구현의 자세한 성격에 관해서는, 처리를 기본 클래스로 캡슐화하거나, T4를 사용하거나, 동적 프록시를 사용하거나, ActiveSharp (또는 모두의 조합)을 사용할 수 있습니다. –

+0

도메인 엔터티는 절대로 INotifyPropertyChanged 의미 론적 측면에서도 적절하다고 보입니다. WPF에서는 UI 스레드에서 모든 PropertyChanged 이벤트가 발생해야합니다. 이로 인해 도메인 엔터티가 UI 스레드에 바인딩됩니다. 그래서, 제 제안은 도메인 엔티티가 "업데이트 된"이벤트를 제공하고 ViewModel이 ui 통지를 처리하도록해야한다는 것입니다. –

2

당신이 직접 대답했습니다. Single responsibility principle이 핵심입니다.

뜻은 도메인 개체에 프레젠테이션 레이어 항목 (또는 내가 따르는 다른 모든 레이어)이 포함되어서는 안됩니다. 그것은 그들의 직업이 아닙니다.

동시에 프로 복서와 발레 댄서가 될 수는 없습니다.

+2

+1 프레젠테이션 레이어 항목은 프레젠테이션 레이어에만 포함되어 있습니다. 그러나 실용적인보기에 대한 내 대답을 참조하십시오. –

+0

권투 선수와 댄서가되는 것이 완전히 불가능하다고 생각하지 않지만, 도메인 모델의 변경 사항이 실제로 프레젠테이션 레이어에 관한 것임을 알리는 것은 아니라고 생각합니다. 그렇다면 SRP는 변화에 대해 알려주는 방법을 어떻게 보존합니까? 이벤트 집계? 어떤 종류의 투표? 그런 오래된 질문에 대해 깨우는 것에 대해 사과드립니다.하지만 완전히 답변되지는 않았다고 생각합니다. –

2

저는 현재 내 동료들과 같은 토론을하고 있습니다. 제안 중 하나는 실제로 도메인 모델에서 NotifyPropertyChanged를 구현하고 이러한 개체를 사용하여 UI에 바인딩하는 것입니다.
또 다른 제안은 도메인 모델을 그대로두고 도메인 모델을 랩핑하거나 장식하는 프리젠 테이션 레이어를 만드는 것입니다. 이 접근 방식에 대한 질문은 도메인 모델에 구현 된 비즈니스 규칙을 UI에 어떻게 전파 할 것인가입니다.
예를 들어 비즈니스 규칙은 "위치가 변경되면 상태를 지워야합니다"입니다. 이것은 도메인 모델에서 쉽게 구현할 수 있지만 별도의 객체를 사용하여 UI를 바인딩하는 경우이 규칙을 다시 구현해야합니다. 현재로서는이 작업을 수행하는 다른 방법이 없습니다.

의견이 있으십니까?
(btw 나는 웹 서비스로 채워지는 아주 간단한 도메인 모델에 대해 이야기하고 있습니다.)

관련 문제