.Net 依赖注入之服务注册的多种方式


忽略服务生命周期的差异,只考虑注册生命周期为Scoped的服务,因为注册其它类型生命周期的服务基本一致

services.AddScoped

services.AddScoped<IOrder, Order>();

//使用工厂的方式注册服务
services.AddScoped<IOrder>(serviceProvider => {
    return new Order();
});

最普通的注入方式

这种方式注册服务就是简单的将服务添加到容器中,
即使容器中原本就有IOrder服务,也会再添加一个IOrder服务进去,这样一来容器中就会存在多个IOrder服务

在需要获取服务的地方注入IOrder服务时,默认会得到最后一个注册的IOrder服务实例

也就是说,如果

services.AddScoped<IOrder, Order1>();
services.AddScoped<IOrder, Order2>();

获取服务时将会得到Order2实例;

如果要获取所有的IOrder服务,可以使用

IEnumerable<IOrder> orders

来接收

services.TryAddScoped

services.TryAddScoped<IOrder, Order>();

使用TryAddScoped可以避免同一个接口注册多个实现

也就是说,如果

services.AddScoped<IOrder, Order1>();
services.TryAddScoped<IOrder, Order2>();

那么Order2的注册将会失败,容器中只存在Order1类型的IOrder服务

services.TryAddEnumerable

services.TryAddEnumerable(ServiceDescriptor.Scoped<IOrder, Order2>());

TryAddEnumerable允许同一接口注册不同类型的实现,但是同一接口不能重复注册相同类型的实现

也就是说, 如果

services.AddScoped<IOrder, Order>();
services.AddScoped<IOrder, Order>();

则只有一个Order被注册到容器中

但如果

services.AddScoped<IOrder, Order1>();
services.TryAddScoped<IOrder, Order2>();

则Order1、Order2都被注册到容器中

注册泛型服务

services.AddScoped(typeof(ITest<>), typeof(Test<>));

替换服务、移除服务

替换

services.Replace(ServiceDescriptor.Scoped<IOrder, Order2>());

移除

services.RemoveAll<IOrder>();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值