2016-08-20 2 views
1

나는 많이 들었지만 행운은 없었다. IWindowService를 어떻게 해결할 수 있습니까?하나의 일반 생성자 매개 변수로 유형을 등록/해결하는 방법

var c = new UnityContainer(); 
c.RegisterType<IvmMain, vmMain>("mvm"); 
c.RegisterType<IWindow, MainWindow>("mw"); 
c.RegisterType(typeof(IWindowService<IvmMain>), typeof(WindowService<vmMain>),"win", 
       new InjectionConstructor(new ResolvedParameter<IWindow>("mw")), 
       new InjectionConstructor(new ResolvedParameter<IvmMain>("mvm"))); 

윈도우 서비스의 구현 :

public class WindowService<TViewModel> : IWindowService<TViewModel> 
{ 
    readonly Window _win; 
    TViewModel _vm; 
    public WindowService(IWindow win, TViewModel vm) 
    { 
     _vm = vm; 
     _win = win as Window; 
     _win.DataContext = vm; 
    } 

오류 : 유형 WindowService이 매개 변수를 생성자가없는 (IWindow

내가 가진 무엇).

답변

2

다음은 작동하는 예제입니다. 제공된 시나리오에서 명명 된 등록에 대한 이유가 없으므로 제거했습니다. 그러나 당신이 정말로 원한다면 그들과 함께 일할 수 있다고 확신합니다.

의 핵심은 함께 IWindowService를 등록하는 것입니다 공유를위한

container.RegisterType(typeof (IWindowService<>), typeof (WindowService<>))

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Registering dependencies ..."); 

     var container = new UnityContainer(); 
     container.RegisterType(typeof (IWindowService<>), typeof (WindowService<>)); 

     container.RegisterType<IWindow, Window>(); 
     container.RegisterType<IvmMain, ViewModel>(); // Or possibly RegisterInstance ? 

     var foo = container.Resolve<IWindowService<IvmMain>>(); 

     Console.ReadKey(); 
    } 
} 

public interface IWindowService<T> 
{ 
} 

public interface IWindow 
{ 
} 

public interface IvmMain 
{ 
} 

public class ViewModel : IvmMain 
{ 
} 

public class Window : IWindow 
{ 
} 

public class WindowService<TViewModel> : IWindowService<TViewModel> 
{ 
    public WindowService(IWindow win, TViewModel vm) 
    { 

    } 
} 
+0

감사합니다! – Legends

+0

또 하나의 질문입니다. (이것에 대해 새로운 Q를 열 수 있습니다) : 생성자 삽입을 사용하므로 명시 적으로 resolve 메소드를 사용하지 않습니다. 또 다른'container.RegisterType ();'이 있고이 클래스를 다른 클래스의 constrtuctor 매개 변수로 사용하고 싶다면? 그런 다음 접근 방법은 무엇입니까? 이제'[Dependency]'속성을 사용하지 않고 명명 된 등록이 필요합니다. – Legends

+0

어떤 방식으로 해결할 것인지 실제로 알아야합니다. 생성자 삽입 여부. 그렇게하는 데는 여러 가지 방법이 있습니다. 이 대답을보십시오. http://stackoverflow.com/questions/38475047/breaking-solid-principles-in-multiple-implementation-of-an-interface/38475681#38475681 – smoksnes

관련 문제