net5学习笔记---依赖注入 (3)

我们可以看到ServiceProvider用来获取服务的实例,它提供了一个扩展IServiceProviderEngine来实现其功能。x下面我们来看一下源码

public static class ServiceProviderServiceExtensions { // 从IServiceProvider获取“T”类型的服务。 public static T GetService<T>(this IServiceProvider provider) => (T)provider.GetService(typeof(T)); // 从IServiceProvider获取“T”类型的服务。 public static object GetRequiredService(this IServiceProvider provider, Type serviceType) { // 如果当前ServiceProvider实现了 ISupportRequiredService // 则直接调用当前ServiceProvier的GetRequiredService获取服务实例 var requiredServiceSupportingProvider = provider as ISupportRequiredService; if (requiredServiceSupportingProvider != null) return requiredServiceSupportingProvider.GetRequiredService(serviceType); //如果当前ServiceProvider未实现ISupportRequiredService //就直接调用GetService获取服务实例,但是如果服务实例为空,则抛出异常 var service = provider.GetService(serviceType); if (service == null) throw new InvalidOperationException(Resources.FormatNoServiceRegistered(serviceType)); return service; } public static T GetRequiredService<T>(this IServiceProvider provider) => (T)provider.GetRequiredService(typeof(T)); //获取指定注册类型<T>的所有服务实例 public static IEnumerable<T> GetServices<T>(this IServiceProvider provider) => provider.GetRequiredService<IEnumerable<T>>(); //获取指定注册类型<T>的所有服务实例 public static IEnumerable<object> GetServices(this IServiceProvider provider, Type serviceType) { //制造一个serviceType类型的IEnumberable<>集合,serviceTypele类型作为当前集合的泛型参数 var genericEnumerable = typeof(IEnumerable<>).MakeGenericType(serviceType); return (IEnumerable<object>)provider.GetRequiredService(genericEnumerable); } //创建一个子IServiceProvider(容器)实例 public static IServiceScope CreateScope(this IServiceProvider provider) => provider.GetRequiredService<IServiceScopeFactory>().CreateScope(); } NET 内置依赖注入实现

我们再Startup.ConfigureServices(IServiceCollection services)进行注册下面我直接用代码来看一下实现

public class UserService : IUserService { public string GetName() { return "王延领"; } } public interface IUserService { string GetName(); }

1.面向接口注册

services.AddScoped(typeof(IUserService), typeof(UserService)); services.AddScoped<IUserService, UserService>();

2.实现形式注册

services.AddScoped<UserService>(); services.AddScoped(typeof(UserService));

两种形式都可以,但扩展性显然是第一种好。

3.批量注入

var assembly = Assembly.GetExecutingAssembly() .DefinedTypes .Where(a => a.Name.EndsWith("Service") && !a.Name.StartsWith("I")); foreach (var item in assembly) { services.AddScoped(item.GetInterfaces().FirstOrDefault(), item); } 第三方容器(Autofact)注入

后续单独一篇文章再写吧。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwxsy.html