忽略服务生命周期的差异,只考虑注册生命周期为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>();