ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DIManager

2022-06-24 01:31:19  阅读:151  来源: 互联网

标签:return service static provider services DIManager public


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);

标签:return,service,static,provider,services,DIManager,public
来源: https://www.cnblogs.com/wl-blog/p/16407344.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有