C# 我可以为.NET Core DependencyInjection提供一个;分解器;返回任何非';你没有注册吗?

C# 我可以为.NET Core DependencyInjection提供一个;分解器;返回任何非';你没有注册吗?,c#,dependency-injection,.net-core,moq,C#,Dependency Injection,.net Core,Moq,给定一个具有依赖项的类: class SomeService : ISomeService { ctor(ISomeDependency someDependency ... } 使用Moq,我可以模拟如下依赖关系: var services = new ServiceCollection() .AddTransient(_ => Mock.Of<ISomeDependency>()) .AddTransient<ISomeService,SomeService>

给定一个具有依赖项的类:

class SomeService : ISomeService { ctor(ISomeDependency someDependency ... }
使用Moq,我可以模拟如下依赖关系:

var services = new ServiceCollection()
.AddTransient(_ => Mock.Of<ISomeDependency>())
.AddTransient<ISomeService,SomeService>()
.BuildServiceProvider();

services.GetRequiredService<ISomeService>(); 
var services=newservicecolection()
.AddTransient(=>Mock.Of())
.AddTransient()
.BuildServiceProvider();
services.GetRequiredService();
我是否可以注册一个“提供者”,如果实现未注册,ServiceProvider将使用该提供者?如果依赖项
T
尚未注册,我希望服务提供商返回
Mock.Of

我想这样做是因为我有一些类有很多依赖项,并且希望避免一些类型

我是否可以注册一个“提供者”,如果实现未注册,ServiceProvider将使用该提供者

对于Microsoft.Extensions.DependencyInjection(MS.DI),没有办法做到这一点。您要查找的是未注册的类型解析。大多数成熟的DI容器实际上包含钩子,允许在请求未注册类型时拦截来自库的调用。但狄女士却没有这样的特点。所有的注册必须明确,没有办法

我是否可以注册一个“提供者”,如果实现未注册,ServiceProvider将使用该提供者


对于Microsoft.Extensions.DependencyInjection(MS.DI),没有办法做到这一点。您要查找的是未注册的类型解析。大多数成熟的DI容器实际上包含钩子,允许在请求未注册类型时拦截来自库的调用。但狄女士却没有这样的特点。所有注册都必须明确进行,没有办法解决。

我删除了我的原始答案,因为它是错误的,我将此作为一条评论,因为我没有尝试过,但它可能会为您指出正确的方向:
BuildServiceProvider()
所做的就是构建一个新的
ServiceProvider
。您应该能够使用自己的
IServiceProvider
实现来包装它,该实现具有
GetService
的实现,该实现可以适当地处理
innerProvider.GetService
的返回值(检测null并构造一个模拟)。@nlawalker我喜欢这个想法,但这只会帮助装饰器的使用者-它不会改变服务提供者本身内部的分辨率。ServiceA依赖于ServiceB。我注册服务A,我不注册服务B。如果应用程序请求ServiceB,则实现您的建议是有效的-它检测到null并返回模拟,如您所述。但是我想要服务。因此,您的包装器为服务A调用innerProvider,innerProvider尝试构造A,并为B请求“自身”。无法让innerProvider请求外部提供程序。是的,您是对的。很抱歉,我已经删除了我的评论-是在错误的心态下,我的回答没有意义。没问题,谢谢你。我删除了我的原始答案,因为它是错误的,我把它作为一个评论,因为我没有尝试过,但它可能会向你指出正确的方向:所有这些
BuildServiceProvider()
正在构建一个新的
服务提供商
。您应该能够使用自己的
IServiceProvider
实现来包装它,该实现具有
GetService
的实现,该实现可以适当地处理
innerProvider.GetService
的返回值(检测null并构造一个模拟)。@nlawalker我喜欢这个想法,但这只会帮助装饰器的使用者-它不会改变服务提供者本身内部的分辨率。ServiceA依赖于ServiceB。我注册服务A,我不注册服务B。如果应用程序请求ServiceB,则实现您的建议是有效的-它检测到null并返回模拟,如您所述。但是我想要服务。因此,您的包装器为服务A调用innerProvider,innerProvider尝试构造A,并为B请求“自身”。无法让innerProvider请求外部提供程序。是的,您是对的。对不起,我已经删除了我的评论-是在错误的心态和我的回应没有意义。没有问题,谢谢你。