DIManager

复制代码
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;

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

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

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <returns></returns>
        public static IServiceProvider SetProvider(IServiceProvider serviceProvider)
        {
            return provider = serviceProvider;
        }

        /// <summary>
        /// 获取已注册的服务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T GetService<T>()
        {
            return provider.GetService<T>();
        }

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

        /// <summary>
        /// 获取已注册的服务
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceNameStartsWith"></param>
        /// <returns></returns>
        public static T GetService<T>(string serviceNameStartsWith)
        {
            var services = GetService<IEnumerable<T>>();
            return services.FirstOrDefault(x => x.GetType().Name.StartsWith(serviceNameStartsWith));
        }

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

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

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

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

    }
}
复制代码

 

startUp中ConfigureServices处 DIManager.BuildProvider(services);
posted @   dreamw  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2021-06-24 .NET技术与企业级信息化解决方案咨询
2020-06-24 input type=button button
2020-06-24 select @@identity的用法
2020-06-24 C#-函数的传值与传址
2020-06-24 关于C#函数对象参数传递的问题
2020-06-24 SQLSERVER聚集索引和主键(PrimaryKey)的误区认识
2020-06-24 #中string字符串转为json与json转对象
点击右上角即可分享
微信分享提示