2014-10-18 2 views
0

MVVM light toolkit을 사용하는 WPF 응용 프로그램이 있다고 가정합니다.MVVM Locator가 등록 된 ViewModel Funcitons을 호출해야합니까?

이 툴킷의 좋은 예는 Locator입니다. SimpleIoC가 포함되어있어 서비스를 등록하고 인터페이스 기반으로 사용할 수 있다는 점이 좋습니다.

때때로 로케이터 생성자가 실제로 커질 수 있습니다. 그것은 단지 예시했다 :

if(SimpleIoc.Default.GetInstance<MainViewModel>().LoadProject()) 
{ 
var project = SimpleIoc.Default.GetInstance<MainViewModel>().LoadedProject 
SimpleIoc.Default.Register<ConfigService>(new Service(project)) 
} 

일부 로직을 포함 Unfortunatelly 인터페이스를 등록 이외에 - 나는 로케이터 생성자 동안 더 로직이 필요하면 무엇. 어쩌면 내 서비스 아키텍처가 잘못 되었기 때문에 잘못 만들어진 것일 수도 있고 그런 경우 로케이터 사용을 사임해야 할 수도 있지만 DI를 잃어 버릴 수도 있습니다.

또 다른 점은 몇 가지 ViewModels에 Locator.GetInstance에 대한 참조가 있다는 점입니다. Locator.GetInstance는 테스트 가능성을 위해 컨스트럭터를 통해 주입되어야하기 때문에 좋은 사례가 아닙니다.

또 다른 측면은 AvalonDock에서 올바르게 사용하는 것입니다.

AvalonDock은 고정 가능한 도킹 가능한 창과 함께 Visual Studio와 유사한 응용 프로그램을 준비 할 수있게 해주는 훌륭한 고정 가능한 제어 도구입니다.

이 창은 실제로 속성을 통해 AvalonDock에 바인딩 된 다른 ViewModels입니다.

MainViewModel 속성 도구 새로운 도구 = [{ViewModel1, ViewModel2}

있지만 각 뷰 모델을 찾기에 등록되어있다. 도 안전하지 - 내 의견으로는 또 다른 나쁜 예입니다 Locator.GetInstance()

:

그러므로 내가 사용하고

재산권 게터로 MainViewModel에서 그들을 (DRY 위반). Avalon Tool ViewModel1에 필요한 서비스가 아직 등록되지 않았지만 MainViewModel 인스턴스 생성 중에 getter를 통해 호출되는 경우 어떻게됩니까?

불일치가 시작되었습니다. 좋은 습관이 있습니까?

나는 Workspaces (MainViewModel)와 같은 많은 예제를 발견했으나 동시에 매우 유용한 Locator를 사용하지 않았습니다.

의존성 주입 및 인터페이스 구동 덕분에 mme가 내 프로젝트를 테스트 할 수있게 해주는 좋은 도구라고 생각하기 때문에 Locator를 유지하고 싶습니다.

아이디어가 있습니까? 나는 감사 할 것이다.

답변

0

저는 이것을 피합니다. 여러분이 올바르게 지적했듯이, 여기에 단순히 유형을 등록하는 것이 더 많이 있습니다.

대신 ConfigService 인스턴스를 해당 생성자의 Viewmodel에 전달합니다. 처음 등록 할 때 config 서비스를 IOC하고 모델을 볼 수 있습니다.

SimpleIOC.Register<IViewModel>(()=>{return new ViewModel(SimpleIOC.GetInstance<IConfigService>())}); 

...그것은 모두 메모리에서 나온 것이므로 정확하지 않을 수도 있지만 SimpleIOC에서 사용자 지정 생성자 아이디어를 보여줍니다.

view 모델 생성자에서 매개 변수로 전달하는 service .Register 메서드를 호출 할 수 있습니다.

귀하의보기 모델에 '지식'이 그대로 유지되고 사용자가 원하는 것을 수행하는 데 집중하게됩니다.