zoukankan      html  css  js  c++  java
  • .NET Core-IServiceCollection扩展一个Replace方法

    Replace方法可替换掉之前注入的服务,比如我们可以替换框架中用到的服务,达到修改源码的目的

        public static class ServiceCollectionExtensions
        {
            public static IServiceCollection Replace<TService, TImplementation>(this IServiceCollection services)
                where TImplementation : TService
            {
                return services.Replace<TService>(typeof(TImplementation));
            }
    
            public static IServiceCollection Replace<TService>(this IServiceCollection services, Type implementationType)
            {
                return services.Replace(typeof(TService), implementationType);
            }
    
            public static IServiceCollection Replace(this IServiceCollection services, Type serviceType, Type implementationType)
            {
                if (services == null)
                {
                    throw new ArgumentNullException(nameof(services));
                }
    
                if (serviceType == null)
                {
                    throw new ArgumentNullException(nameof(serviceType));
                }
    
                if (implementationType == null)
                {
                    throw new ArgumentNullException(nameof(implementationType));
                }
    
                if (!services.TryGetDescriptors(serviceType, out var descriptors))
                {
                    throw new ArgumentException($"No services found for {serviceType.FullName}.", nameof(serviceType));
                }
    
                foreach (var descriptor in descriptors)
                {
                    var index = services.IndexOf(descriptor);
    
                    services.Insert(index, descriptor.WithImplementationType(implementationType));
    
                    services.Remove(descriptor);
                }
    
                return services;
            }
    
            private static bool TryGetDescriptors(this IServiceCollection services, Type serviceType, out ICollection<ServiceDescriptor> descriptors)
            {
                return (descriptors = services.Where(service => service.ServiceType == serviceType).ToArray()).Any();
            }
    
            private static ServiceDescriptor WithImplementationType(this ServiceDescriptor descriptor, Type implementationType)
            {
                return new ServiceDescriptor(descriptor.ServiceType, implementationType, descriptor.Lifetime);
            }
        }
    
  • 相关阅读:
    java selenium (九) 常见web UI 元素操作 及API使用
    java selenium (六) XPath 定位
    java selenium (八) Selenium IDE 用法
    java selenium (五) 元素定位大全
    一个使用CSocket类的网络通信实例
    揭开链接器的面纱(中)
    揭开连接器的面纱(上)
    深入理解程序的结构
    调试利器GDB(下)
    调试利器GDB(上)
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/14489748.html
Copyright © 2011-2022 走看看