2016-10-10 1 views
0

필자는 Prism에서 Dependency Injection을 위해 Unity를 사용하고 있으며, 사용자가 테스트를 실행 중이고 입력이 없을 때 내 모듈 중 하나가 화면 보호기를 표시하는 상황이 있습니다. (이 모듈에 대한보기를 보유하고있는 영역은 다른 모든 지역 앞에 표시됩니다.) 사용자가 테스트가 실행되는 동안 방의 다른 쪽으로 가면 아이디어가 관련 테스트 정보의 요약을 볼 수 있습니다. 응용 프로그램과 다시 상호 작용하면 화면 보호기가 종료되고 기본 화면으로 돌아갑니다.프리즘의 셸에서 이벤트 올림. 공유 서비스를 사용하는 방법이 있습니까? 아니면 PubSubEvent 만 사용 하시겠습니까?

셸은 사용자 입력을 캡처하므로 사용자가 컴퓨터와 상호 작용할 때보기를 숨기려면 화면 보호기 모듈에 경고해야합니다.

화면 보호기 모듈 자체는 ViewModel에서 Enable() 메서드와 Disable() 메서드로 구성된 공유 서비스 인터페이스를 구현합니다. 화면 보호기는 테스트가 실행 중일 때만 사용할 수 있습니다. 이 테스트를 실행하는 모듈은 필요에 따라 활성화/비활성화를 호출합니다. ViewModel에는 화면 보호기가 활성화되면 만료시보기 표시가 트리거되는 내부 타이머가 있습니다. 사용자가 상호 작용하면 타이머가 재설정되고보기가 숨겨집니다.

나는 PubSubEvents를 가질 필요가 없을 때 많은 양의 PubSubEvents를 가지지 못하도록하고 싶습니다. 이 경우 사용자가 상호 작용할 때 쉘이 사용자 상호 작용을 알리는 데 사용할 수있는 화면 보호기 서비스에 메서드를 추가 할 수 있기를 바랍니다. 그러나 ServiceLocator를 사용하거나 내 셸의 화면 보호기 프로젝트에 대한 참조를 추가하지 않는 한 화면 보호기 모듈 전에 셸이 만들어지기 때문에 PubSubEvent가 없으면 어떻게되는지 알 수 없습니다. 나는 PubSubEvent를 사용하는 것보다 더 나쁜 옵션이라고 생각한다. 나 자신의 개별 모듈로 서비스를 분리하고 Shell/Boostrapper (ConfigureContainer()를 통해 등록)에서 참조하는 경우에도 해당 모듈은 여전히 ​​ViewModel과 통신하여 타이머를 재설정하거나보기를 숨길 수 있어야합니다 .

나는 이것을 지나치게 생각하지 않습니까? 내가 할 수있는 다른 방법이 있니? 또는 PubSubEvent에 대한 내 생각이 가장 좋습니다. 필자는 프리즘에 대해 아직 익숙하지 않아 최상의 실천 사례를 계속 다루고 있습니다.

답변

1

EventAggregator을 사용할 때 아무런 문제가 보이지 않지만, 물론 화면 보호기를 사용하거나 사용하지 않도록 설정하는 것과 같은 기본적으로 동일한 특수 서비스를 사용할 수 있습니다. 이 서비스를 싱글 톤 (singleton)으로 등록하고 필요할 때마다 주입하십시오.

동일한 서비스에 의해 구현되는 능동 (예를 들면 EnableScreenSaver()DisableScreenSaver()) 및 수동 (예 IsScreenSaverEnabled 속성 및 이벤트 ScreenSaverStateChanged)으로 두 개의 서로 다른 인터페이스 부재를 분리해서, 좀 더 좋은 것을 확인한다. 이 방법을 사용하면 EventAggregator에 약간의 이점이 있습니다. 이벤트는 게시 전용 또는 구독 전용 일 수 없으며, 이벤트가 항상 을 구독 할 수 있음을 알고있는 사람은 구독 할 수 없습니다. 그러나 액티브 인터페이스는 화면 보호기를 제어하려는 앱의 부분에만 알리는 반면 수동 인터페이스는 제어해야하는 화면 보호기가있는 부분 만 알 수 있습니다.

+0

쉘이 서비스 전에 생성되기 때문에 쉘에 주입합니까? 부트 스트 래퍼가 등록 할 수 있도록이 서비스에 대한 참조를 셸 프로젝트에 포함 시키더라도이 서비스는 사용자가 마우스 나 유형을 움직일 때 화면을 숨기고 타이머를 재설정해야한다는 것을 화면 보호기 모듈이 알도록해야합니다 키보드. 화면 보호기가 구독하는 서비스에 이벤트를 추가하는 것은 의미가 없습니다. 그 이벤트는 쉘에서 해당 서비스로의 일부 표시에서 발생하기 때문에 PubSubEvent는 훨씬 더 깨끗한 솔루션입니다. – GrantA

+0

부트 스트 래퍼 (예 :'ConfigureContainer')에서 서비스를 등록하면 쉘이 해결 될 때 서비스를 사용할 수 있습니다.그 외, 위에서 언급 한 것처럼'EventAggregator' /'PubSubEvent'는 완벽하게 유효합니다 ... – Haukinger

+0

ConfigureContainer에 대해 알고 있습니다. 내가 이해하지 못했던 점은 서비스가 부트 스트 래퍼에 등록 된 것과 서비스 모듈에 등록 된 인터페이스라는 두 개의 인터페이스를 갖게된다는 것입니다. 전자는 셸이 사용자 상호 작용이 발생했음을 나타냅니다. 후자는 스크린 세이버에 연결된 ViewModel이 가입 할 수있는 이벤트를 개최합니다. (그리고 그 인터페이스는 ViewModel의 생성자에 삽입 될 것입니다.) 그러나 이것을 알아 내면, PubSubEvent는 다중 인터페이스 된 공유 서비스를 사용하는 것이 약간 고문받는 것처럼 보이기 때문에 훨씬 간단한 옵션이라고 생각합니다. 감사! – GrantA

관련 문제