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