首页 新闻 会员 周边 捐助

.NET: 单元测试中如何给构造函数的 IServiceScopeFactory 类型的参数传值

0
悬赏园豆:30 [已解决问题] 解决于 2023-04-12 12:39

比如下面的构造函数,在不使用 mock 的情况下,如何创建 IServiceScopeFactory 的实例传参?

public ContactInfoRulesService(IServiceScopeFactory serviceScopeFactory)
{
}
dudu的主页 dudu | 高人七级 | 园豆:30778
提问于:2023-04-12 11:43
< >
分享
最佳答案
1

https://github.com/dotnet/runtime 中的对应源码 发现 ServiceProviderEngineScope 实现了 IServiceScopeFactory

internal sealed class ServiceProviderEngineScope : IServiceScope, IServiceProvider, IAsyncDisposable, IServiceScopeFactory
{ }

从 ServiceProvider 的实现源码 ServiceProvider.cs#L187 发现 CreateScope 方法的实现就是创建 ServiceProviderEngineScope 实例

internal IServiceScope CreateScope()
{
    if (_disposed)
    {
        ThrowHelper.ThrowObjectDisposedException();
    }

    return new ServiceProviderEngineScope(this, isRootScope: false);
}

于是通过下面的代码解决了问题

IServiceCollection services = new ServiceCollection();
var serviceProvider = services.BuildServiceProvider();
var scopeFactory = (IServiceScopeFactory)serviceProvider.CreateScope();
IContactInfoRulesService contactInfoRulesService = new ContactInfoRulesService(scopeFactory);
dudu | 高人七级 |园豆:30778 | 2023-04-12 12:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册