private static void AddSingleService(IServiceCollection services, ServiceDescriptor descriptor, [CanBeNull] DependencyAttribute dependencyAttribute) { if (dependencyAttribute?.ReplaceExisting == true) { services.Replace(descriptor); } else if (dependencyAttribute?.TryAdd == true) { services.TryAdd(descriptor); } else { services.Add(descriptor); } }
/// <summary> /// 重写以实现 从类型获取要注册的<see cref="ServiceLifetime"/>生命周期类型 /// </summary> /// <param name="type">类型</param> /// <returns>生命周期类型</returns> private static ServiceLifetime?GetLiftTimeOrNull(Type type) { DependencyAttribute dependencyAttribute = type.GetAttribute <DependencyAttribute>(); if (dependencyAttribute != null) { return(dependencyAttribute.Lifetime); } if (type.IsDeriveClassFrom <IScopeDependency>()) { return(ServiceLifetime.Scoped); } else if (type.IsDeriveClassFrom <ISingletonDependency>()) { return(ServiceLifetime.Singleton); } else if (type.IsDeriveClassFrom <ITransientDependency>()) { return(ServiceLifetime.Transient); } return(null); }
private static void AddToServices(IServiceCollection services, Type implementationType) { if (implementationType.IsAbstract || implementationType.IsInterface) { return; } ServiceLifetime?lifetime = GetLiftTimeOrNull(implementationType); if (lifetime == null) { return; } DependencyAttribute dependencyAttribute = implementationType.GetAttribute <DependencyAttribute>(); Type[] serviceTypes = GetImplementedInterfaces(implementationType); // 服务数量位0 注册自身 if (serviceTypes.Length == 0) { services.TryAdd(new ServiceDescriptor(implementationType, implementationType, lifetime.Value)); return; } //服务实现显示要求注册身处时,注册自身并且继续注册接口 if (dependencyAttribute?.AddSelf == true) { services.TryAdd(new ServiceDescriptor(implementationType, implementationType, lifetime.Value)); } // 注册服务 for (int i = 0; i < serviceTypes.Length; i++) { Type serviceType = serviceTypes[i]; ServiceDescriptor descriptor = new ServiceDescriptor(serviceType, implementationType, lifetime.Value); if (lifetime.Value == ServiceLifetime.Transient) { services.TryAddEnumerable(descriptor); continue; } bool multiple = serviceType.HasAttribute <MultipleDependencyAttribute>(); if (i == 0) { if (multiple) { services.Add(descriptor); } else { AddSingleService(services, descriptor, dependencyAttribute); } } else { //有多个接口,后边的接口注册使用第一个接口的实例,保证同个实现类的多个接口获得同一实例 Type firstServiceType = serviceTypes[0]; descriptor = new ServiceDescriptor(serviceType, provider => provider.GetService(firstServiceType), lifetime.Value); if (multiple) { services.Add(descriptor); } else { AddSingleService(services, descriptor, dependencyAttribute); } } } }