dotnet 3.1、v3 Azure関数、およびMS DependencyInjectionパッケージの3.1.8を使用して、部分的に閉じた汎用DI登録を初めて使用しようとしました。これらはすべて執筆時点で最新のものです。
コンストラクターの依存関係として設定すると、型は期待どおりに解決されます。ただし、コンテナでGetService <>を直接呼び出すと、ArgumentException
次のようになります。
提供されるジェネリック引数の数が、ジェネリック型定義のアリティと等しくありません
実行時にこのエラーが発生した場合、部分的に閉じたジェネリックはサポートされていないと結論付けますが、そうではなく、理由がわかりません。
public interface IMyInterface<TypeA, TypeB>
{
}
public class MyClass<TypeA> : IMyInterface<TypeA, MyConcreteTypeB>
{
}
services.AddSingleton(typeof(IMyInterface<,>), typeof(MyClass<>));
var myObject = services
.BuildServiceProvider()
.GetService<IMyInterface<MyConcreteTypeA, MyConcreteTypeB>>();
myObject.Should().Be().OfType<MyClass<MyConcreteTypeA>>();
上記の(大まかな)コードを単体テストとして実行することはできませんが、IMyInterface<MyConcreteTypeA, MyConcreteTypeB>
Azure関数のコンストラクターパラメーターとして解決できます。
更新:
これは興味深い質問です。関数コンストラクターで機能する理由は、内部的に関数ホストがのカスタムサービスプロバイダーを実装するDIコンテナーとしてDryIocを使用するためですMicrosoft.DependencyInjection
。次に、DryIocコンテナは、部分的に閉じたジェネリック型の解決をサポートします。ここで、ファンクションホストDIの配線を調べることができます。
ここで、単体テストの問題を解決して、関数ホストの同じ動作をシミュレートします。
services.AddSingleton(typeof(IMyInterface<,>), typeof(MyClass<>));
var myObject = DryIocAdapter.Create(services).BuildServiceProvider() // using DryIoc.Microsoft.DependencyInjection;
.GetService<IMyInterface<MyConcreteTypeA, MyConcreteTypeB>>();
myObject.Should().Be().OfType<MyClass<MyConcreteTypeA>>();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加