.Net核心服务容器,是否保证可以为该接口注册最后一个服务?

罗恩C

使用默认的Asp.net Core IoC容器,是否可以保证如果为一个接口注册了多种对象类型,并且我要求该接口提供服务,则IoC将始终返回为该接口注册的最后一个对象类型?

(我阅读了.Net核心依赖项注入文档,但似乎没有解决此问题。https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection

示范

假设我有这个介面:

interface ITest
{

    void Create(int id);
}

这些类:

public class TestOne: ITest {
    int id;
    public void Create(int id) {
        this.id = id;
    }
}

public class TestTwo: ITest {
    int id;
    public void Create(int id) {
        this.id = id;
    }
}


public class TestThree: ITest {
    int id;
    public void Create(int id) {
        this.id = id;
    }
}

现在,在该ConfigureServices方法的Startup.cs中,添加以下代码:

services.AddSingleton<ITest, TestTwo>();
services.AddSingleton<ITest, TestThree>();
services.AddSingleton<ITest, TestOne>();

在startup.csConfigure方法中,如果我编写以下代码:

 var serviceCollection = app.ApplicationServices.GetServices<ITest>();

我去问对象的集合:TestTwoTestThreeTestOne按此顺序。

在startup.csConfigure方法中,如果我编写以下代码:

var service = app.ApplicationServices.GetService<ITest>();

在这种情况下,似乎总是返回为该接口注册的最后一个对象的实例TestOne

我是否可以保证如果为一个接口注册了多个对象类型,并且要求该接口提供服务,则IoC总是会返回为该接口注册的最后一个对象类型?

史蒂文

我想说,获得最后一个是有保证的。如果查看源代码,则可以看到当前行为:

// internal class ServiceProvider
ServiceEntry entry;
if (_table.TryGetEntry(serviceType, out entry))
{
    return GetResolveCallSite(entry.Last, callSiteChain);
}

如果Microsoft将来改变这种行为,那将是一个重大的突破性变化,不仅会影响.NET Core DI容器的客户端,而且还会影响第三方容器的所有适配器的客户端。

这也会破坏适配器,因为.NET Core容器的行为决定了DI抽象的协定,并且这也波及到适配器。

由于这种重大变化将是非常严重的,因此他们永远无法更改此行为,这意味着该行为得到了保证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有nginx和.NET核心服务的Service Fabric

如何访问Asp.net核心服务的DbContext

给定远程服务器上的每个帐户是否可以为每个帐户使用一个SSH密钥?

一个Redis连接可以为一千个并发用户提供服务吗?

.Net核心托管服务保证将完成

是否可以定义一个与实现(使用eclipse和jersey分离)的jax-rs服务接口?

Apache CXF + SpringBoot:我可以为一个SOAP Web服务发布多个端点吗?

我可以为 Windows 制作一个 DIY 云服务器吗?

我可以为Jekyll一个全新的网站提供服务,但无法建立

是否有一个指标示例项目,该指标可以在13.10中调用远程服务?

是否可以从另一个服务调用 ConfirmationService

是否可以在同一个类中使用,同一个接口的不同实现,使用 Microsoft.Extensions.DependencyInjection 中的服务

是否有一种kubernetes cronjob类型,可以为一个容器映像提供多个计划?

是否可以为Wrapper接口编写一个通用的函数包装函数,以表示包装其他类型的类型?

可以为一个Api设置两个身份验证吗?身份服务器4

Docker Compose:是否可以在构建另一个服务之前启动服务?

是否可以为GADT创建一个Monoid实例?

是否可以为一个特定的执行配置ObjectMapper?

如何在ASP.NET核心服务中使用*关键字

您应该如何根据依赖关系树来处理.net核心服务?

如何获取.net核心服务器名称和选项

如何在Linux上启动Asp.net核心服务器并保持其运行

Azure Linux WebApp上的ASP.NET Core核心服务

是否可以同时在另一个服务中注入一个服务,反之亦然?

一个线程写入的值是否可以保证在不锁定该变量的情况下被另一个线程看到?

实体框架核心服务的默认生存期

使用核心服务按其tcm id提取组件

我可以为我的 discord bot 加入的每个服务器创建一个不同的 bot 实例,以便在不同服务器中设置的变量不会影响另一个服务器吗?

什么是从一个容器到另一个容器的 url 服务?