DIManager


using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Scg.Core.Extensions.DependencyInjection
{
    /// 
    /// 依赖注入管理类
    /// 
    public static class DIManager
    {
        private static IServiceProvider provider;

        /// 
        /// 必须在所有Service注册完成之后调用,否则会导致手动Resolve某个Service的时候失败
        /// 
        /// 
        public static IServiceProvider BuildProvider(IServiceCollection services)
        {
            return provider = services.BuildServiceProvider();
        }

        /// 
        /// 
        /// 
        /// 
        /// 
        public static IServiceProvider SetProvider(IServiceProvider serviceProvider)
        {
            return provider = serviceProvider;
        }

        /// 
        /// 获取已注册的服务
        /// 
        /// 
        /// 
        public static T GetService()
        {
            return provider.GetService();
        }

        public static T GetRequiredService()
        {
            return provider.GetRequiredService();
        }

        /// 
        /// 获取已注册的服务
        /// 
        /// 
        /// 
        /// 
        public static T GetService(string serviceNameStartsWith)
        {
            var services = GetService>();
            return services.FirstOrDefault(x => x.GetType().Name.StartsWith(serviceNameStartsWith));
        }

        /// 
        /// 获取已注册的服务
        /// 
        /// 
        /// 
        /// 
        /// 
        public static T GetService(IEnumerable services, string serviceNameStartsWith)
        {
            return services.FirstOrDefault(x => x.GetType().Name.StartsWith(serviceNameStartsWith));
        }

        /// 
        /// 获取服务,为空时使用给定值
        /// 
        /// 
        /// 
        /// 
        public static T GetServiceOrDefault(T instance)
        {
            var service = provider.GetService();
            if (service == null)
            {
                return instance;
            }
            return service;
        }

        /// 
        /// 获取已注册的服务(租户化实现,若未找到实现,将获取租户code为generic的实现)
        /// 
        /// 
        /// 租户Code
        /// 
        public static T GetTenantService(string code) where T : class
        {
            //var services = provider.GetServices();
            //foreach (var service in services)
            //{
            //    var attr = service.GetType().GetTypeInfo().GetCustomAttribute(false);
            //    if (attr != null && attr.Codes.Any(p => p.Equals(code, StringComparison.OrdinalIgnoreCase) || p == DIConstants.GenericTenantCode))
            //    {
            //        return service;
            //    }
            //}
            return null;
        }

        /// 
        /// 创建实例(该实例初始化依赖于已注册的部分服务)
        /// 
        /// 
        /// 
        public static T NewInstance()
        {
            return ActivatorUtilities.CreateInstance(provider);
        }

    }
}
startUp中ConfigureServices处 DIManager.BuildProvider(services);