2016-08-24 11 views
1

私は同じインタフェースから派生した複数の型を持っています。そして私は、私は、私はすべての問題なしに、以下のようなタイプを解決することができますUnity:現在のタイプ 'XXXXX'はインタフェースであり、構築できません。型マッピングがありませんか?

 container.RegisterType<IService, ServiceA>("NameA"); 
     container.RegisterType<IService, ServiceB>("NameB"); 
     container.RegisterType<IService, ServiceC>("NameC"); 

以下のように、これらのタイプを登録する場合は種類

public interface IService 
{ 
} 

public class ServiceA : IService 
{ 
} 

public class ServiceB : IService 
{ 

} 

public class ServiceC : IService 
{ 

} 

を登録するにはユニティIOCコンテナを使用しています。

var service = container.Resolve<IService>("NameA"); 

しかし、私は外部からコンテナに登録する必要があるタイプのリストを取得しています。 (テキストファイルから想定する)。だから私は、提供されたリストにあるタイプだけを登録する必要があります。

public class Program 
{ 
    public static void Main() 
    { 
     // i will be getting this dictionary values from somewhere outside of application 
     // but for testing im putting it here 
     var list = new Dictionary<string, string>(); 
     list.Add("NameA", "ServiceA"); 
     list.Add("NameB", "ServiceB"); 
     list.Add("NameC", "ServiceC"); 


     var container = new UnityContainer(); 
     var thisAssemebly = Assembly.GetExecutingAssembly(); 

     //register types only that are in the dictionary 
     foreach (var item in list) 
     { 
      var t = thisAssemebly.ExportedTypes.First(x => x.Name == item.Value); 
      container.RegisterType(t, item.Key); 
     } 

     // try to resolve. I get error here 
     var service = container.Resolve<IService>("NameA"); 
    } 
} 

私はタイプ 'Microsoft.Practices.Unity.ResolutionFailedException' の未処理の例外が Microsoft.Practices.Unity.dll

追加情報で発生した例外

を取得しています:解像度依存関係が失敗した場合は、タイプ= "ConsoleApplication1.IService"、name = "NameA"と入力します。

例外が発生しました:解決中です。

例外:InvalidOperationException - 現在のタイプ ConsoleApplication1.IServiceがインタフェースであり、 を構築できません。型マッピングがありませんか?例外の時点で


、コンテナがした

解決ConsoleApplication1.IService、NameA

私は大会オプションでユニティのレジスタを使用したくないいくつかの正当な理由のために、またはUnityの設定ファイルオプションを使用してタイプを登録します。私が持っているリストに基づいてそれらを登録したいと思います。

答えて

0

あなたはマッピングIYourInterfaceを指定するのを忘れて - > YOURCLASS

これは動作します:

namespace ConsoleApplicationGrbage 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 

     var list = new Dictionary<string, string>(); 
     list.Add("NameA", "YourClass"); 

     var thisAssemebly = Assembly.GetExecutingAssembly(); 
     var exT = thisAssemebly.ExportedTypes; 
     //register types only that are in the dictionary 
     foreach (var item in list) 
     { 
      var typeClass = exT.First(x => x.Name == item.Value); 
      var ivmt = Type.GetType("ConsoleApplicationGrbage.IYourInterface"); 
      // --> Map Interface to ImplementationType 
      container.RegisterType(ivmt, typeClass, item.Key); 
      // or directly: 
      container.RegisterType(typeof(IYourInterface), typeClass, item.Key);  
     } 

     var impl = container.Resolve<IYourInterface>("NameA"); 
    } 
} 


public interface IYourInterface 
{ 
} 

public class YourClass: IYourInterface 
{ 

} 

} 
関連する問題