MVVM, DDD 및 WPF 계층 응용 프로그램 프로젝트 구조 지침


17

VS에서 응용 프로그램 구조를 설정하려고하는데 합리적인 수준으로 "시도"하고 나중에 증명하고 싶습니다. 이 응용 프로그램은 규칙을 따르지 않은 이전 Winform 앱을 WPF로 다시 작성합니다. 레이어, 계층, 약어 등이 없습니다.

상당히 게으른 엔터프라이즈 응용 프로그램입니다. Linq To SQL을 DB로 사용하고 항상 MS SQL 일 가능성이 높습니다. 또한 기존 기술이 설정되어 있습니다.

MVVM과 DDD를 최대한 활용하고 싶지만 이들을 결합 할 때 응용 프로그램의 구조가 혼란스러워집니다. 몇 가지 예를 들어서 설명해 드리겠습니다.

MVVM을 따르면 내 폴더 구조는 다음과 같습니다.

Views
Models
ViewModels
Helpers

그러나 이것이 내 프로젝트 구조가 다음과 유사한 단순한 DDD 계층 접근 방식에 어떻게 적합합니까?

MyApp.UI
MyApp.Domain
MyApp.Data

나는를 배치해야합니까 Models도메인 층 또는 내가 말 3 개 버전이 있습니까 Person? 이것은 DB 객체의 리포지토리와 매핑을 어디에 배치 할 것인가에 대한 또 다른 질문으로 이어집니다. 나는 데이터를 가정합니다 ...

Views나는 UI에 갈 것이지만 ViewModels?

마지막으로, 비즈니스 로직을 어디에 포함시킬 것인가?

CodePlex, DDD Example 에서 다음을 발견했으며 도움이되었지만 웹 응용 프로그램에 대한 것 같지만 중요하지 않으며 무지가 빛납니다.

내가 틀리지 말아라, 나는 많은 폴더를 가질 수 있고 내가 원하는대로 전화 할 수 있다는 것을 안다. 나는 물건을 어디에 두어야하는지 알아 내려고 노력하고 있는데, 이것이 그 장소가 반드시 불려지는 것이 아니라 확장이 가능할 것입니다.

내 질문의 핵심은 다음과 같이 보일 수 있습니다.
tblPerson의해 생성 된 객체가 *.dbml있습니다. 이것은 명백하며 내 "데이터"레이어에 속합니다.
이제 Model, DTO, Domain Model 또는 별도의 Layer (project?)에서 호출 된 모든 것이 Person있습니다. 나는이 필요 Mapper위한 PersontblPerson내가 어디에 넣어하는 방법 확실하지 않다 그.
그런 다음 ViewModel을 사용 EditPerson하여 가져 오는 자체 속성을 Person가지지 만 더 많이 가져올 수 있습니다.
마지막으로 해당 ViewModel에 바인딩 된 View가 있습니다 ....

내 가정과 추측으로 단락이 채워 졌음을 분명히하기 위해 누군가가 나를 위해 공기를 깨끗하게하거나 통찰력을 제공하여 6 개월에서 1 년 동안 내가 필요 이상으로 자신을 걷어 차지 않기를 바라고 있습니다.


Linq To SQL은 더 큰 프로젝트에는 적합하지 않습니다. Entity Framework 또는 nHibernate와 같은 다른 ORM을 사용하십시오. 또한이 클라이언트 전용 응용 프로그램입니까, 아니면 클라이언트 서버입니까?
Euphoric

WPF 클라이언트 전용 응용 프로그램입니다. 또한 내 유일한 데이터 소스가 MS SQL 인 경우 L2S가 중간 규모 이상의 앱에 적합하지 않다고 생각하는 이유를 설명 할 수 있습니까?
Refracted Paladin

답변:


5

MVVM은 UI 패턴이며 클라이언트에서 사용됩니다.

클라이언트에서 사용되는 DDD의 도메인 부분은 아마도 모델의 일부일 것입니다.

View 및 ViewModel은 클라이언트 전용입니다.

리포지토리는 모델을 백엔드와 동기화하기 때문에 모델에 (또는 근처에) 리포지토리를 넣었습니다.

예, 여러 번 다른 네임 스페이스에 여러 Person 클래스가 생성됩니다. 그것들은 매우 비슷하게 시작될 수 있지만 몇 번의 반복 또는 릴리스 후에는 매우 다를 수 있습니다.

편집하다

리포지토리에 대한 부분을 명확하게하고 Business Logic의 포지셔닝에 대한 자세한 설명

별도의 클라이언트를 포함하는 시스템을 작성하는 경우 클라이언트 및 서버에서 서버 측 / 백엔드 저장소를 사용할 수 있습니다. 클라이언트에서 서버의 추상화를 제공하고 서버에서 다른 서버 및 데이터 소스의 추상화를 제공합니다. 패턴 일뿐입니다.

비즈니스 규칙의 경우 : 클라이언트에서 규칙을 사용하는 경우 서버에서도 규칙을 시행해야합니다. 클라이언트를 신뢰하지 마십시오. 클라이언트의 비즈니스 규칙을 사용하면 빠른 입력 확인이 가능하고 서버 왕복이 방지됩니다.

나는 DDD가 서버 측에 속하고 클라이언트에게 '누설'한다고 생각합니다.


2

WPF 애플리케이션을위한 MVVM 디자인 패턴을 선택하는 데 올바른 방향 이 있습니다.

Do I put the Models in the Domain layer?

예, 모델을 도메인에 배치 할 수 있습니다

Where would I put my Repository and mappings of DB Object to Domain Object?

리포지토리는 도메인이 배치 된 계층에 배치 할 수 있습니다. 매핑 개체 (DTO-도메인 전송 개체라고도 함)를 서비스 계층에 배치해야하며 강력한 매핑 도구 인 AutoMapper 를 사용 하여 도메인 개체를 DTO에 쉽게 매핑 할 수 있습니다 .

ViewModels also?

ViewModel은 클라이언트 쪽 (계층)에 배치해야합니다. 뷰에 따라 하나 이상의 DTO에서 뷰 모델을 구성 할 수 있습니다.

DDD 에 관해서 는 이것에 대해 읽고 도메인 기반 디자인 패턴이 정말로 필요하다는 것을 분명히 제안합니다. 다음은 모든 소프트웨어 응용 프로그램의 95 %가 "DDD 사용에 적합하지 않음"범주에 속하는 논의입니다 .

편집 : 참조가 위에 추가되었으며 @Den에게 감사드립니다!


투표 할 때 의견을 말하십시오.
Yusubov

1
DDD 팬 보이는 어디에서나 사용하려고합니다. 관련 링크 : stackoverflow.com/questions/810606/is-ddd-a-waste-of-time
Den

@ 덴, 링크 주셔서 감사합니다! 나는 그것을 찾을 계획이었다.
Yusubov

1

우리가 어디로 가는지를 탐구하기 전에 각 계층이 무엇을 해야하는지에 대해 이야기 해 봅시다.

MVVM의 판매 지점은 뷰와 뷰 모델 간의 바인딩입니다. 여기서 목표는 뷰 내에서 논리를 제거하는 것입니다.
뷰와 마찬가지로 모델은 매우 가벼워 야하며 뷰 모델이 작동하는 데 필요한 정보 (데이터)에만 액세스해야합니다. 모델은 다른 데이터 소스에 대한 액세스를 혼합 할 수 있지만 비즈니스 로직이 없어야합니다. 대부분의 경우 히트 할 단일 데이터 저장소가 있습니다. 어떤 경우에는 그렇지 않습니다. 그렇지 않은 경우 모델을 사용하여 VM의 데이터 소스를 가려야합니다.

MVVM의 암시 적 요점은 데이터가 이미 저장되어 있고 프로젝트 유지 관리에 대한 책임이 없다는 것입니다. 일부 프로젝트는 그 가정을 피할만큼 운이 좋으며, 내가 작업 한 대부분의 프로젝트는 그렇게 운이 좋지 않았습니다. 데이터는 우리가 싸워야 할 또 다른 계층이라고 말할 수 있습니다.

내 프로젝트를 다음과 같이 배치 할 것입니다.

 project.Views
 project.ViewModel
 project.Model
 project.DataStructs

이 레이어는 필요에 따라 추가 할 수 있습니다.

 project.Helpers

나머지 스택에서 도우미를 분리하여 응용 프로그램 스택의 계층으로 혼동되지 않습니다.

면책 조항 : 저는 DDD 전문가는 아니지만 일반적인 요점을 이해하고 접근 방식의 가치를 봅니다.

귀하의 도메인 은 귀하 가 고려중인 문제 세트가 될 것입니다. 도메인 모델을 생성하는 ViewModels에 주로 대응하려고; 뷰 내에서 조금; Model / DataStructs 내의 작은 덩어리입니다.

어떻게 작동할까요?
경우 기존 데이터 구조를 변경하는 기능이, 당신이 만든 새로운 당신이 해결하려는 문제에 대한 상관 관계를해야한다. 고객 객체가 있습니까? 그런 다음 고객과 관련된 / 일부 테이블이 있어야합니다. 송장이나 제품이 있습니까? 동일한 스토리 – 해당 비즈니스 오브젝트에 맵핑되는 테이블 및 구조를 작성해야합니다.

도메인은 ViewModel 객체와 해당 객체에서 제공하는 뷰를 통해 표현됩니다. 고객 레코드를 편집해야하는 경우 해당 작업을 처리 할 VM이 있습니다.

당신의 질문에 :

  1. DDD를 MVVM에 오버레이하려고하지 마십시오. 그것은 작동하지 않을 것입니다. DDD는 레이아웃 패턴이 아니며 전체 문제를 보는 방법입니다.
  2. 리포지토리 및 매핑은 project.Data 또는 project.Model에 적절하게 존재합니다.
  3. project.Views라고 부르지 않는 한 UI라는 레이어가 없습니다.
  4. Business Logic은 View-Model에 들어갑니다.

1
알 겠어, 아마 무지한 사람들은 질문을 따라가 (1) 각각을 별도의 프로젝트 또는 폴더 (예 : Project.View 등)로 만드시겠습니까? (2) DataStructs는 * .dbml 또는 Project.Data를 넣을 위치입니다. (3) 귀하의 의견으로는 Project.Domain이 없습니까? 나는 몇 번 사용하는 것이 내가 묻는 이유임을 보았다.
굴절 성기사

@RefractedPaladin-1) 프로젝트 내의 폴더 만. 데이터가 자체 프로젝트 여야한다고 주장 할 수 있습니다. 유지 관리 관점에서 어느 쪽이든 동일합니다. 2) 그렇습니다. 3) 아니요, .Domain 폴더가 없습니다. IMO는 응용 프로그램을 비즈니스 문제 영역에 매핑하는 것입니다. 따라서 도메인은 프로젝트의 모든 레이어에 스며 듭니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.