2016-08-20 3 views
1

anmeldet/auflöst Ich versuchte viele approches, aber kein Glück. Wie kann ich den IWindowService auflösen?Wie man einen Typ mit einem generischen Konstruktorparameter

Das ist, was ich habe:

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"))); 

Die Implementierung des Fensters Service:

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; 
    } 

Fehler: Der Typ WindowService keinen Konstruktor haben, der die Parameter nimmt (IWindow).

Antwort

2

Hier ist ein Arbeitsbeispiel. In dem von Ihnen angegebenen Szenario gibt es keinen Grund für die genannten Registrierungen. Daher habe ich sie entfernt. Aber ich bin sicher, Sie können es mit ihnen arbeiten lassen, wenn Sie wirklich wollen.

Der Schlüssel ist IWindowService mit registrieren: für die gemeinsame Nutzung

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

Dank! – Legends

+0

Eine weitere Frage (ich kann ein neues Q dafür öffnen): Ich benutze Konstruktorinjektion, daher verwende ich die Methode resolve nicht explizit. Wenn ich einen anderen 'container.RegisterType ();' hätte und diesen als Constrtuctor-Parameter in einer anderen Klasse verwenden wollte? Was wäre dann der Ansatz? Jetzt würde ich benannte Registrierungen..witout 'Attribut [Abhängigkeit] benötigen – Legends

+0

Eine Weise, die Sie wirklich wissen müssen, welchen Typ Sie auflösen möchten. Konstruktorinjektion oder nicht. Es gibt eine Reihe von Möglichkeiten, dies zu tun. Sieh dir diese Antwort an. http://StackOverflow.com/Questions/38475047/Breaking-solid-Principles-in-Multiple-Implementation-of-an-interface/38475681#38475681 – smoksnes

Verwandte Themen