2017-01-04 3 views
1

내 응용 프로그램 (MVVM 아키텍처 기반 WPF 응용 프로그램)에서는 ICommand서비스으로 많이 사용합니다. 이러한 명령 중 일부는 메뉴 항목, 도구 모음, 상태 표시 줄 등에 바인딩되어 각 컨테이너보기 모델에 주입 될 수 있습니다. 자, 그들 중 일부는 예를 들어 에있는 데이터를 조작 할 수 있으므로 은 그 종속물입니다. 도 컨테이너 (메뉴, 상태 표시 줄 ...)를 호스트하기 때문에 순환 종속성을 얻습니다. (쉘 -> 메뉴 -> 명령 -> 쉘).순환 종속성 및 제어 반전 -이를 해결하는 방법은 무엇입니까?

현재 MEF를 사용하여 응용 프로그램을 작성하므로 문제는 재산 또는 개인 회원 가입으로 해결할 수 있지만 대부분의 경우이 서비스는 전혀 도움이되지 않습니다. 부모에게이 의존성이 필요함을 말해 주지만).

내 질문은이 같은 문제를 해결하는 일반적인 방법은 무엇 : 나는 MEF를 사용한 적이

class Shell : IShell 
    .ctor(IMenu) 

class Menu : IMenu 
    .ctor(ICommand[]) 

class ExitCommand : ICommand 
    .ctor(IShell) 
+0

상위 뷰 모델 ('Shell')에서 명령을 호출하거나 전역 적으로 사용할 수있는 두 가지 명령은'EventAggregator' 구현 ('Prism'의'PubSubEvent') 또는'Prism'의'CompositeCommand'입니다.). – mechanic

+0

"쉘"이란 무엇입니까? 더 설명해 주시겠습니까? – Joe

+0

@Joe 셸은 주로 다른 모든 뷰 구성 요소의 컨테이너 역할을하는 뷰 모델입니다. – artganify

답변

1

을하지만, 의존성 주입 컨테이너를 사용 하는가와 유사한 문제에 직면했다. 문제는, (내 생각 엔) 당신이 Shell (서비스 종료) 기능을 제공하지만, ViewModel (메뉴 표시 등) 역할을합니다. 그것은 더 많은 책임을지고 있습니다.

하는의는 것을 입증하기 위해 별도의 모듈로 캐치 올 "IShell"인터페이스를 나누어 보자

class Shell : IShell, IExitManager 
    .ctor(IMenu) 

class Menu : IMenu 
    .ctor(ICommand[]) 

class ExitCommand : ICommand 
    .ctor(IExitManager) 

당신의 쉘은 한 번에 두 가지 일을하고있다, (IExitManager)는 (IShell) 뷰 모델의 물건과는 종료 관리입니다.

ViewModel의 기능을 추상적으로 설명합니다. 전용 IExitManager 서비스를 만듭니다. ShellViewModel을이 기능을 구현하는 대신 exit 이벤트를 트리거하는 데 필요한 모든 기능을 주입하는 대신 (메뉴 기능을 드래그하여 순환 종속성을 유발하는) 대신 IExitManager 전용 기능을 사용할 수 있습니다. 대신

현재 :

enter image description here

대신 쉘 구현 중 서비스를 가지고 :

enter image description here

클래스 IExitManager 현재 당신과 같은 기능을 노출해야합니다 쉘에서 IShell (나는 Exit() 메소드를 사용한다)과 이벤트 핸들러 ExitRequestedHandler을 가지고있다. 그것은 행동입니다.

EventAggregator는 기본적으로 더 일반적인 버전입니다.이 기능을 살펴 보시기 바랍니다. Shell이 ​​EventExit 이벤트를 수신하고 명령에서 이벤트를 수신하도록 할 수 있습니다. 유일한 공통 종속성은 EventAggregator 서비스입니다. 이 솔루션이하는 일은 Exit 이벤트에만 해당하는 "one off"버전입니다. 이 작업을 많이한다면 EventAggregator를 사용하십시오.