首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从Microsoft.Extensions.DependencyInjection.IServiceProvider获得混凝土类型

无法从Microsoft.Extensions.DependencyInjection.IServiceProvider获得混凝土类型
EN

Stack Overflow用户
提问于 2018-05-22 17:30:44
回答 1查看 1.1K关注 0票数 1

我正在注册一个接口(IFoo)和Microsoft.Extensions.DependencyInjection服务,如下所示:

代码语言:javascript
复制
servicesBuilder.AddSingleton<IFooRepository, FooInMemoryRepository>();

当我这样解决依赖关系时,几乎完全不知道具体类型:

代码语言:javascript
复制
services.GetRequiredService<IFooRepository>()

在这种情况下,一切正常。然而,在很少的情况下,我需要具体的实现(FooInMemoryRepository),所以我想直接解决这个问题。我试过这么叫

代码语言:javascript
复制
services.GetRequiredService<FooInMemoryRepository>()

但是,这会引发异常:

代码语言:javascript
复制
System.InvalidOperationException: No service for type 'UserQuery+FooInMemoryRepository' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at UserQuery.Main() in C:\Users\User\AppData\Local\Temp\LINQPad5\_ntmafjyh\query_eecehy.cs:line 37

示例代码(LINQPad):

代码语言:javascript
复制
void Main()
{
    var servicesBuilder = new ServiceCollection();
    servicesBuilder.AddSingleton<IFooRepository, FooInMemoryRepository>();
    servicesBuilder.AddSingleton<IFooRepository, FooOtherRepository>();
    var services = servicesBuilder.BuildServiceProvider();
    try
    {
        var foos = services.GetServices<IFooRepository>();
        foreach(var foo in foos)
        {
            Console.WriteLine(foo.SomeMethod());
        }
        var ifoo = services.GetRequiredService<IFooRepository>();
        Console.WriteLine(ifoo.SomeMethod());
        var inMemoryRepo = services.GetRequiredService<FooInMemoryRepository>();
        Console.WriteLine(inMemoryRepo.SomeMethod());
    }
    catch(InvalidOperationException ioex)
    {
        Console.WriteLine(ioex.ToString());
    }
}

// Define other methods and classes here
public interface IFooRepository
{
    string SomeMethod();
}

public class FooInMemoryRepository : IFooRepository
{
    public string SomeMethod() => "InMemory Foo";
}

public class FooOtherRepository : IFooRepository
{
    public string SomeMethod() => "Other Foo";
}

输出:

代码语言:javascript
复制
InMemory Foo
Other Foo
Other Foo
System.InvalidOperationException: No service for type 'UserQuery+FooInMemoryRepository' has been registered.
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at UserQuery.Main() in C:\Users\TheGreatCO\AppData\Local\Temp\LINQPad5\_ntmafjyh\query_jcpvdk.cs:line 45

如果我注册了所有的IFooRepository实例,我就会得到这两个实例。如果我只请求IFooRepository,我将得到最后一个注册的具体实现。如果我要求一个具体的实现,我就会得到一个InvalidOperationException

这里是否有可能从依赖项注入器中解析具体类型,还是必须始终解析所有这些类型,找到我想要的具体类型并将其转换为具体类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-22 17:41:54

是的,你可以,但你必须明确地注册它。

除了……之外

代码语言:javascript
复制
servicesBuilder.AddSingleton<IFooRepository, FooInMemoryRepository>();
servicesBuilder.AddSingleton<IFooRepository, FooOtherRepository>();

你也需要

代码语言:javascript
复制
servicesBuilder.AddSingleton<FooInMemoryRepository>();
servicesBuilder.AddSingleton<FooOtherRepository>();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50473461

复制
相关文章

相似问题

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