関数で実行しているときに部分的に閉じたジェネリックが機能するのに、ServiceCollectionを直接呼び出しているときに機能しないのはなぜですか?

Mrpanicci

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関数のコンストラクターパラメーターとして解決できます

更新:

実例:https//github.com/mr-panucci/sandbox

クリシュグ

これは興味深い質問です。関数コンストラクターで機能する理由は、内部的に関数ホストがのカスタムサービスプロバイダーを実装するDIコンテナーとしてDryIoc使用するためですMicrosoft.DependencyInjection次に、DryIocコンテナは、部分的に閉じたジェネリック型の解決をサポートします。ここで、ファンクションホストDIの配線を調べることができます

ここで、単体テストの問題を解決して、関数ホストの同じ動作をシミュレートします。

  1. nugetDryIoc.Microsoft.DependencyInjectionをテストプロジェクトに追加します。
  2. 以下のようにテストコードを更新します。
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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ