using CloudBuilder.Core.Application.Options;
using CloudBuilder.Core.Application.Packs;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
namespace CloudBuilder.Core.Application.Builders
{
///
/// CloudBuilder构建器
///
public class CloudBuilderBuilder
{
public CloudBuilderBuilder(IServiceCollection services, IConfiguration configuration)
{
this.Services = services;
AddOptions(configuration);
}
///
/// 获取 服务集合
///
public IServiceCollection Services { get; }
///
/// 获取 CloudBuilder选项配置委托
///
public CloudBuilderOptions CloudBuilderOptions { get; private set; }
///
/// 添加所有模块
///
/// 要添加的模块类型
public CloudBuilderBuilder AddPack()
{
var baseType = typeof(CloudBuilderPack);
var allAssemblies = GetAssemblies();
var types = allAssemblies
.SelectMany(a => a.DefinedTypes)
.Select(type => type.AsType())
.Where(type => type != baseType && baseType.IsAssignableFrom(type))
.Where(x => x.IsClass)
.OrderBy(x => x.GetCustomAttribute()?.Level).ToList();
foreach (var implementType in types)
{
if (Services.Any(m => m.ServiceType == baseType && m.ImplementationType == implementType))
{
continue;
}
//注入CloudBuilderPack模块内的服务
CloudBuilderPack pack = (CloudBuilderPack)Activator.CreateInstance(
implementType,
BindingFlags.Public | BindingFlags.Instance,
null,
null,
null);
pack.AddServices(Services, this);
}
return this;
}
///
/// 添加CloudBuilder选项配置
///
/// CloudBuilder操作选项
/// CloudBuilder构建器
public CloudBuilderBuilder AddOptions(IConfiguration configuration)
{
CloudBuilderOptions options = new CloudBuilderOptions();
new CloudBuilderOptionsSetup(configuration).Configure(options);
CloudBuilderOptions = options;
return this;
}
public T GetTransientService()
{
object? t = Services.BuildServiceProvider().GetService(typeof(T));
if (t == null) return default(T)!;
return (T)t;
}
public T GetTransientRequiredService()
{
return (T)Services.BuildServiceProvider().GetRequiredService(typeof(T));
}
public static Assembly[] GetAssemblies()
{
// 获取入口程序集
var entryAssembly = Assembly.GetEntryAssembly();
List reference = new List();
if (!string.IsNullOrWhiteSpace(entryAssembly.Location))
{
var dependencyContext = DependencyContext.Default;
// 读取项目程序集或 Furion 官方发布的包,或手动添加引用的dll,或配置特定的包前缀
reference = dependencyContext.RuntimeLibraries
.Where(u => u.Type == "project" || u.Type == "reference")
.Select(x => x.Name).ToList();
}
string[] filters =
{
"mscorlib",
"netstandard",
"dotnet",
"api-ms-win-core",
"runtime.",
"System",
"Microsoft",
"Window",
};
//遍历文件夹的方式,用于传统.netfx
string path = AppContext.BaseDirectory;
string[] files = Directory.GetFiles(path, "*.dll", SearchOption.TopDirectoryOnly)
.Where(x => reference.Contains(Path.GetFileNameWithoutExtension(x))).ToArray();
return files.Where(file => filters.All(token => Path.GetFileName(file)?.StartsWith(token) != true)).Select(Assembly.LoadFrom).ToArray();
}
}
}