首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么部分封闭的泛型在函数中运行时工作,而在直接调用ServiceCollection时却不工作?

为什么部分封闭的泛型在函数中运行时工作,而在直接调用ServiceCollection时却不工作?
EN

Stack Overflow用户
提问于 2020-10-07 12:13:31
回答 1查看 297关注 0票数 3

我刚刚尝试使用部分封闭的泛型DI注册,首次使用DotNet3.1、v3 Azure函数和MS DependencyInjection包的3.1.8 --所有这些都是在编写本报告时的最新结果。

当将类型设置为构造函数依赖项时,将按希望解析这些类型。但是,当我直接调用容器上的GetService<>时,就会得到一个ArgumentException

提供的泛型参数数不等于泛型类型定义的正确性。

如果我在运行时看到这个错误,我会得出结论,不支持部分封闭的泛型,但事实并非如此,我也不知道为什么。

代码语言:javascript
运行
复制
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。

更新:

工作示例:https://github.com/mr-panucci/sandbox

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 10:42:59

这是一个有趣的问题。它在函数构造函数中工作的原因是,内部函数主机使用DryIoc作为实现Microsoft.DependencyInjection的自定义服务提供者的DI容器。DryIoc容器反过来又支持解析部分封闭的泛型类型。您可以探索功能主机DI布线这里

现在,为了解决单元测试的问题,在这里模拟函数主机的相同行为:

  1. 将nuget DryIoc.Microsoft.DependencyInjection添加到测试项目中。
  2. 更新测试代码如下:
代码语言:javascript
运行
复制
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>>();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64243795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档