私たちのミドルウェアでは、インタフェースは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を使用する必要がありますか?これは可能でもないのですか?それは可能でなければならない。
の可能性のある重複した[どのように私は、ジェネリックメソッドを呼び出すためにリフレクションを使用していますか?](http://stackoverflow.com/questions/232535/how-do-i-use-reflection-to-call-a -generic-method) – thehennyy