1

MVib와 Caliburn.Micro 및 Ninject를 기반으로하는 WPF 애플리케이션이 있습니다. ShellViewModel이라는 루트 뷰 모델이 있습니다. Caliburn의 부트 스트 래퍼에서 구성되는 몇 가지 종속성 (생성자를 통해 주입 됨)이 있습니다. 여태까지는 그런대로 잘됐다.동적으로 객체를 생성하는 동안 제어 반전을 사용하여 서비스 로케이터 방지하기

어딘가에 두 개의 버튼이있는 MenuViewModel이 있으며, 다른 버튼을 차례로 클릭하면 다른 뷰 모델이 자체 종속성을 갖습니다. 이러한 뷰 모델은 루트 객체를 만드는 동안 만들어지지 않지만 IOC 컨테이너에서 종속성을 주입하려고합니다.

나는이 질문을 service locator vs dependency injection에서 읽었으며 그 점을 이해하고 있습니다.

내 MenuViewModel이 동적으로 만들어지는 뷰 모델을 삽입하기 위해 내 IoC 컨테이너에 액세스 할 수 있어야한다는 인상을 받고 있습니다. 나는 피하려고합니다. 다른 방법이 있습니까?

답변

1

네, 조금 더 나은 것을 할 수 있다고 생각합니다.

주문형 요구 사항이 없다면 객체 모델의 루트 (ShellViewModel)에 도달 할 때까지 해당 뷰 모델을 MenuViewModel 등의 종속성으로 만들 수 있고 컨테이너가 연결됩니다 모든 것.

종속성 자체를 위해 MenuViewModel 종속성을 구성 할 수있는 것을 대체하여 개체 그래프에 "방화벽"을 넣을 수 있습니다. 컨테이너는이 직업에 대한 분명한 선택이며 IMHO는 실용적인 관점에서 보면 이것이 순수하지 않더라도 충분한 솔루션입니다.

하지만 컨테이너 대신 공장 인을 사용할 수도 있습니다. 이 팩토리는 컨테이너에 대한 종속성을 취하고 실제 종속성에 대한 읽기 전용 특성을 제공합니다 (MenuViewModel). 속성에 액세스하면 컨테이너가 객체를 확인하고 반환하게됩니다 (접근 자 메서드는 속성 대신 작동 할 것이므로 다른 토론이 전체적으로 유용하므로 더 나은 것으로 생각하는 것을 사용하십시오).

실제 상태를 변경하지 않은 것처럼 보일 수도 있지만 MenuViewModel이 컨테이너에 직접 종속 된 경우 상황은 동일하지 않습니다. 지금은 훨씬 더 유익

interface IMenuViewModelDependencyFactory 
{ 
    public RealDependencyA { get; } 
    public RealDependencyB { get; } 
} 

같은에 대한 종속성이 있다고 볼 것입니다 동안이 경우 당신은 MenuViewModel의 실제 의존성이 공용 인터페이스를 보면 어떤 생각이 없을 것이다. 당신은 콘크리트 MenuViewModelDependencyFactory 사물의 공용 인터페이스를 보면 또한 훨씬 더 있습니다

class MenuViewModelDependencyFactory : IMenuViewModelDependencyFactory 
{ 
    private Container container; 

    public MenuViewModelDependencyFactory(Container container) { ... } 

    public RealDependencyA { get { ... } } 
    public RealDependencyB { get { ... } } 
} 

MenuViewModelDependencyFactory이 너무 매우 고도의 전문이기 때문에 여기에 컨테이너와 함께 할 예정 어떤 이상 혼동이 없어야합니다.

+0

이전에이 팩토리 유형의 접근 방식을 이미 보았지만 실제로 인터페이스에서 의존성을 지정하는 것은 아니 었습니다. – diggingforfire

관련 문제