/// <summary> /// 注册单例服务 /// </summary> /// <param name="services">服务集合</param> /// <param name="type">类型</param> /// <param name="injectionAttribute">注入特性</param> /// <param name="canInjectInterfaces">能被注册的接口</param> private static void AddSingleton(IServiceCollection services, Type type, InjectionAttribute injectionAttribute, IEnumerable <Type> canInjectInterfaces) { // 注册自己 if (injectionAttribute.InjectionScope is InjectionScopeOptions.Self or InjectionScopeOptions.All) { switch (injectionAttribute.Injection) { case InjectionOptions.TryAdd: services.TryAddSingleton(type); break; case InjectionOptions.Add: services.AddSingleton(type); break; default: break; } } if (!canInjectInterfaces.Any()) { return; } // 只注册第一个接口 if (injectionAttribute.InjectionScope == InjectionScopeOptions.FirstOneInterface) { var firstInterface = canInjectInterfaces.First(); switch (injectionAttribute.Injection) { case InjectionOptions.TryAdd: services.TryAddSingleton(firstInterface, type); break; case InjectionOptions.Add: services.AddSingleton(firstInterface, type); break; default: break; } } // 注册多个接口 else if (injectionAttribute.InjectionScope is InjectionScopeOptions.ImplementedInterfaces or InjectionScopeOptions.All) { foreach (var inter in canInjectInterfaces) { switch (injectionAttribute.Injection) { case InjectionOptions.TryAdd: services.TryAddSingleton(inter, type); break; case InjectionOptions.Add: services.AddSingleton(inter, type); break; default: break; } } } }
/// <summary> /// 注册类型 /// </summary> /// <param name="services">服务</param> /// <param name="type">类型</param> /// <param name="injectionAttribute">注入特性</param> /// <param name="inter">接口</param> private static void RegisterType(IServiceCollection services, RegisterType registerType, Type type, InjectionAttribute injectionAttribute, Type inter = null) { if (registerType == Fur.DependencyInjection.RegisterType.Transient) { RegisterTransientType(services, type, injectionAttribute, inter); } if (registerType == Fur.DependencyInjection.RegisterType.Scoped) { RegisterScopeType(services, type, injectionAttribute, inter); } if (registerType == Fur.DependencyInjection.RegisterType.Singleton) { RegisterSingletonType(services, type, injectionAttribute, inter); } }
/// <summary> /// 注册单例接口实例类型 /// </summary> /// <param name="services">服务</param> /// <param name="type">类型</param> /// <param name="injectionAttribute">注入特性</param> /// <param name="inter">接口</param> private static void RegisterSingletonType(IServiceCollection services, Type type, InjectionAttribute injectionAttribute, Type inter = null) { switch (injectionAttribute.Injection) { case InjectionOptions.TryAdd: if (inter == null) { services.TryAddSingleton(type); } else { services.TryAddSingleton(inter, type); } break; case InjectionOptions.Add: if (inter == null) { services.AddSingleton(type); } else { services.AddSingleton(inter, type); } break; default: break; } }
/// <summary> /// 注册服务 /// </summary> /// <param name="services">服务集合</param> /// <param name="registerType">类型作用域</param> /// <param name="type">类型</param> /// <param name="injectionAttribute">注入特性</param> /// <param name="canInjectInterfaces">能被注册的接口</param> private static void RegisterService(IServiceCollection services, RegisterType registerType, Type type, InjectionAttribute injectionAttribute, IEnumerable <Type> canInjectInterfaces) { // 注册自己 if (injectionAttribute.InjectionScope is InjectionScopeOptions.Self or InjectionScopeOptions.All) { RegisterType(services, registerType, type, injectionAttribute); } if (!canInjectInterfaces.Any()) { return; } // 只注册第一个接口 if (injectionAttribute.InjectionScope == InjectionScopeOptions.FirstOneInterface) { RegisterType(services, registerType, type, injectionAttribute, canInjectInterfaces.First()); } // 注册多个接口 else if (injectionAttribute.InjectionScope is InjectionScopeOptions.ImplementedInterfaces or InjectionScopeOptions.All) { foreach (var inter in canInjectInterfaces) { RegisterType(services, registerType, type, injectionAttribute, inter); } } }