나는 긴 질문에 대해 사과하고, 그것은 rant로 조금 읽지 만, 그렇지 않다고 약속합니다! 아래에 내 질문을 요약했습니다.
MVC 세계에서는 상황이 간단합니다. 모델에는 상태가 있고,보기 에는 모델이 표시 되며, 컨트롤러 는 모델에 대한 작업을 수행하며 (기본적으로) 컨트롤러에는 상태가 없습니다. 작업을 수행 하기 위해 Controller는 웹 서비스, 저장소, 로트에 대한 종속성이 있습니다. 컨트롤러를 인스턴스화 할 때 이러한 종속성을 제공하는 것에 관심이 있습니다. 작업을 실행할 때 (컨트롤러의 방법) 해당 종속성을 사용하여 모델을 검색 또는 업데이트하거나 다른 도메인 서비스를 호출합니다. 어떤 사용자가 특정 항목의 세부 정보를 보려는 것처럼 컨텍스트가 있으면 해당 항목의 Id를 매개 변수로 Action에 전달합니다. Controller의 어느 곳에도 상태에 대한 참조가 없습니다. 여태까지는 그런대로 잘됐다.
MVVM을 입력하십시오. 나는 WPF를 좋아하고 데이터 바인딩을 좋아합니다. Caliburn Micro atm을 사용하여 ViewModels에 데이터를 더 쉽게 바인딩 할 수있는 프레임 워크를 좋아합니다. 나는이 세상에서 일이 덜 간단하다고 생각합니다. 하자 다시 운동을 할 : 모델 상태보기가 보여 뷰 모델을, 그리고 뷰 모델이 수행 모델 (기본적으로)와 /에 물건을하는 뷰 모델은 수행 상태를 가지고! 위해 (하나 개 이상의 모델에 아마 위임 모든 속성을,하지만 수단 그 자체의 상태를있는 모델 중 하나의 방법으로 또는 다른에 대한 참조가 있어야 명확하게) 할ViewModel은 웹 서비스, 저장소, 로트에 의존합니다. ViewModel을 인스턴스화 할 때 해당 종속성뿐만 아니라 상태도 제공하는 것이 중요합니다. 그리고 신사 숙녀 여러분, 나는 끝까지 귀찮게합니다.
당신은 인스턴스를 필요로 할 때마다 ProductDetailsViewModel
으로부터 ProductSearchViewModel
(있는 당신이 호출 된 ProductSearchWebService
차례로 돌려 IEnumerable<ProductDTO>
, 당신이이 가지 중 하나를 수행 할 수 있습니다? 나와 함께 아직도, 모두) :
- call
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, 이것은 나쁘다, 3 개의 의존성을 더 상상해라. 이것은 의존성ProductSearchViewModel
을 가져야 한다는 것을 의미한다 . 또한 생성자를 변경하는 것은 고통 스럽습니다. - call
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, 팩토리는 단지 Func이며, 대부분의 IoC 프레임 워크에 의해 쉽게 생성됩니다. Init 메소드가 누출되는 추상화이기 때문에 이것이 나쁘다고 생각합니다. 또한 Init 메소드에 설정된 필드에는 readonly 키워드를 사용할 수 없습니다. 몇 가지 이유가 더있을 것입니다. - call
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
so ... 이것은 일반적으로 이러한 유형의 문제에 권장되는 패턴 (추상 공장)입니다. 나는 실제로 사용하기 시작할 때까지 정적 타이핑에 대한 갈망을 충족시키기 때문에 천재적이었습니다. 상용구 코드의 양은 너무 많이 생각합니다 (사용하는 어리석은 변수 이름과는 별도로). 런타임 매개 변수가 필요한 각 ViewModel에 대해 두 개의 추가 파일 (공장 인터페이스 및 구현)이 제공되며 4 개의 추가 시간과 같은 비 런타임 종속성을 입력해야합니다. 그리고 종속성이 변경 될 때마다 팩토리에서도 변경됩니다. 더 이상 DI 컨테이너를 사용하지 않는 것 같습니다. ( Castle Windsor에는 이것에 대한 일종의 해결책이 있다고 생각 합니다. - 익명의 유형이나 사전으로 무언가를하십시오. 나는 정적 타이핑을 좋아합니다.
네 이러한 방식으로 상태와 동작을 혼합하면 MVC에는 전혀 존재하지 않는 문제가 발생합니다. 그리고 현재이 문제에 대한 적절한 해결책이 없다고 생각합니다. 이제 몇 가지 사항을 관찰하고 싶습니다.
- 사람들은 실제로 MVVM을 사용합니다. 그래서 그들은 위의 모든 것을 신경 쓰지 않거나 다른 훌륭한 해결책을 가지고 있습니다.
- WPF가있는 MVVM에 대한 심층적 인 예를 찾지 못했습니다. 예를 들어, NDDD 샘플 프로젝트는 일부 DDD 개념을 이해하는 데 크게 도움이되었습니다. 누군가가 MVVM / WPF와 비슷한 방향으로 나를 가리킬 수 있다면 정말로 좋아합니다.
- 어쩌면 MVVM을 모두 잘못하고있을 것이므로 디자인을 뒤집어 놓아야합니다. 어쩌면 나는이 문제가 전혀 없어야합니다. 글쎄, 나는 다른 사람들이 같은 질문을 했으므로 내가 유일한 사람은 아니라고 생각합니다.
요약
- ViewModel을 상태와 동작의 통합 지점으로 만드는 것이 MVVM 패턴 전체에 어려움을 겪는 이유라고 결론을 내릴 수 있습니까?
- 추상 팩토리 패턴을 사용하는 것이 ViewModel을 정적으로 유형화하는 유일한 방법 / 최상의 방법입니까?
- 심도있는 참조 구현과 같은 것이 있습니까?
- 디자인 냄새가 많은 상태 / 동작을 가진 많은 ViewModel이 있습니까?