2016-08-20 7 views
1

私は多くのアトラクションを試しましたが、運はありませんでした。 IWindowServiceを解決するにはどうすればよいですか?1つの汎用コンストラクタパラメータを使用して型を登録/解決する方法

これは私が持っているものです。

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

もう1つの質問(私はこれに対して新しいQを開くことができます): 私はコンストラクタインジェクションを使用するので、私は明示的にresolveメソッドを使用しません。 別の 'container.RegisterType ();'があり、これを別のクラスのconstrtuctorパラメータとして使用したい場合は、 そのときのアプローチは何ですか? 名前付き登録が必要です。[依存関係]属性を使わずに – Legends

+0

あなたは本当に解決したいタイプを知る必要があります。コンストラクタインジェクションかどうか。これを行うにはいくつかの方法があります。この答えを見てください。 http://stackoverflow.com/questions/38475047/breaking-solid-principles-in-multiple-implementation-of-an-interface/38475681#38475681 – smoksnes

関連する問題