2017-01-06 14 views
1

私はAutofacを使用して、複数の種類と一般的なインターフェイスを登録しようとしていると私は呼びたい:汎用インターフェースをAutoFacのインターフェースタイプに登録するには?

container.Resolve<Enumerable<IGenericInterface<IInterface>>>(); 

メソッドはIInterfaceの種類とIGenericInterfaceのすべての実装を解決するには。

私はすでにインタフェースを持つジェネリックインターフェイスとして具体的なクラスと一般的なインタフェースを持つ具象クラスに登録してみました:

builder.Register(r => new TalkToMeLoud()) 
    .As<IGenericInterface<Hello>>() 
    .As<IGenericInterface<Bye>>() 
    .As<IGenericInterface<IInterface>>() 
    .InstancePerDependency(); 

をしかし、これはエラーをスローします:

An unhandled exception of type 'System.ArgumentException' occurred in Autofac.dll

Additional information: The type 'TestConsoleApp.TalkToMeLoud' is not assignable to service 'TestConsoleApp.IGenericInterface`1[[TestConsoleApp.IInterface, TestConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'.

のでこれはUnityからAutofacへの移行の一部です。これはUnityのように次のようにして行うことができます:

Container.ResolveAll(typeof(IGenericInterface<IInterface>)) 

誰もこの問題を解決する方法を知っていますか?これは私のtestproject

答えて

0

メッセージは非常に明確です:

PS

つまり

The type 'TalkToMeLoud' is not assignable to service 'IGenericInterface'.

、あなたが持っているでしょういずれかに:

  • TalkToMeLoudまたは
  • IGenericInterface<IInterface>を実装
  • Tを01に設定して、IGenericInterface<T>の共変を確認してください引数。すなわちIGenericInterface<out T>

CLRはHelloIInterfaceを実装していることがIGenericInterface<Hello>を実装する場合でもIGenericInterface<IInterface>TalkToMeLoudをキャストすることはできません。あなたが分散の概念に精通していない場合は、少しGoogle検索を行い、this oneのような答えを読んでほしいかもしれません。

あなたの場合はおそらくインターフェイスをcovarantにする必要があります。これにより、IGenericInterface<Hello>からIGenericInterface<IInterface>にキャストすることができます。ただし、これは、Tがインターフェイスの出力引数としてのみ使用されている場合にのみ機能します。

+0

これは私にとって有益な情報ですが、UnityがIEnumerable >ですべての実装を解決できる理由を知っていますか? – donlobbo

+0

@donlobbo:​​ 'IGenericInterface 'がvariantでない場合、Unityが返すリストは空でなければなりません。そうでない場合は、あなたの質問を更新してください:1.あなたのインターフェイス定義、2.あなたの単一構成3.どのような実装があなたがその列挙型を解決するときに解決され、4つの実装の定義。 – Steven

関連する問題