2016-05-20 11 views
0

私たちのミドルウェアでは、インタフェースはGlobal.asax.csにバインドされています。 IESFPingableを実装するインターフェイスが見つかるまで、すべてFieldInfoに反映されるHandshakeInvokerを作成しました。それが見つかると、プロバイダのping()クラスを呼び出すインターフェイスのインスタンスを作成する必要があります。私の問題は、一度一致が見つかると、インターフェイスの作成に問題があることです。Ninjectを使用すると、インタフェースのインスタンスが作成されます

Global.asax.csバインド:

kernel.Bind<IAccountProvider>().To<AccountProvider>().InSingletonScope(); 

HandshakeInvokerを:

public object Invoke(object instance, object[] inputs, out object[] outputs) 
{ 
    outputs = new object[0]; 
    Type interfaceType = typeof(IESFPingable); 

    FieldInfo[] fields = serviceType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
    foreach (FieldInfo f in fields) 
    { 
     if (interfaceType.IsAssignableFrom(f.FieldType)) 
     { 
      Console.WriteLine(" >> Field {0} Implements {1}", f.fieldType.Name, interfaceType.Name); 
      var interfaceToPing = kernel.Get<f.FieldType.Name>(); 
     } 
    } 
    return DateTime.Now; //return date for now 
} 

私はエラーを取得:

名 'カーネル' は現在のコンテキストおよびタイプ には存在しませんか、名前空間名 'f'が見つかりませんでした(使用していないのはです指示)...

私は間違って何をしていますか?すべての助けが大いに感謝します。

編集:私たちはインターフェイスをインスタンス化するためにNinjectを使用します。私はkernel.Getを使う必要があると言われています。リフレクションはインターフェイスを文字列(f.FieldType.Name)として返し、Getでエラーをスローします。しかしそれ以外に、カーネルに何を入れても問題ありません。私は型または名前空間のエラーを取得します。私はしようとしました タイプmyType = Type.GetType(f.FiedlType.Name)と入れてkernel.Getと同じエラーを取得します。私は百の異なるものを試したので運がない人もいます。私はこの投稿が私に言及したジェネリックの答えはNinjectを使わないのでここではうまくいかないと言われました。

別のアセンブリのプロバイダクラスでメソッドを呼び出すだけで済みます。 Interface/ProviderはGlobal.asaxのバインディングに含まれていますが、試してみても機能しません。私は非常に不満です。 DependencyResolverを使用する必要がありますか?これは可能でもないのですか?それは可能でなければならない。

+0

の可能性のある重複した[どのように私は、ジェネリックメソッドを呼び出すためにリフレクションを使用していますか?](http://stackoverflow.com/questions/232535/how-do-i-use-reflection-to-call-a -generic-method) – thehennyy

答えて

0

これははるかに優れています。インターフェイスの新しいインスタンスを作成する必要はありませんでした。

public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     outputs = new object[0]; 

     Type interfaceType = typeof(IESFPingable); 
     Type T = instance.GetType(); 
     FieldInfo[] fields = T.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
     foreach (var f in fields) 
     { 
      var result = f.GetValue(instance); 

      if (result is IESFPingable) 
      { 
       (result as IESFPingable).Ping(); 
      } 
     } 
     return DateTime.Now; //temporary 
    } 
関連する問題