我刚刚尝试使用部分封闭的泛型DI注册,首次使用DotNet3.1、v3 Azure函数和MS DependencyInjection包的3.1.8 --所有这些都是在编写本报告时的最新结果。
当将类型设置为构造函数依赖项时,将按希望解析这些类型。但是,当我直接调用容器上的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函数中的构造函数param。
更新:
发布于 2020-10-08 10:42:59
这是一个有趣的问题。它在函数构造函数中工作的原因是,内部函数主机使用DryIoc作为实现Microsoft.DependencyInjection
的自定义服务提供者的DI容器。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>>();
https://stackoverflow.com/questions/64243795
复制相似问题