using DS.Module.Core.Extensions;
using DS.Module.Core.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using System.Linq.Expressions;
namespace DS.Module.Core.Modules;
public class ModuleApplicationBase : IModuleApplication
{
public Type StartupModuleType { get; set; }
public IServiceCollection Services { get; set; }
public IServiceProvider ServiceProvider { get; set; }
///
/// 模块接口容器
///
public IReadOnlyList Modules { get; set; }
public List Source { get; protected set; }
public ModuleApplicationBase(Type startupModuleType, IServiceCollection services)
{
StartupModuleType = startupModuleType;
Services = services;
services.TryAddSingleton();
services.TryAddSingleton();
services.AddSingleton(this);
services.TryAddObjectAccessor();
Source = this.GetAllModule(services);
Modules = this.LoadModules();
}
protected virtual List GetAllModule(IServiceCollection services)
{
var typeFinder = services.GetOrAddSingletonService();
var typs = typeFinder.Find(o => DSAppModule.IsAppModule(o));
var modules = typs.Select(o => CreateModule(services, o)).Distinct();
return modules.ToList();
}
protected virtual void SetServiceProvider(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
ServiceProvider.GetRequiredService>().Value = ServiceProvider;
}
///
/// 获取所有需要加载的模块
///
///
protected virtual IReadOnlyList LoadModules()
{
List modules = new List();
var module = Source.FirstOrDefault(o => o.GetType() == StartupModuleType);
//if (module == null)
//{
// throw new Exception($"类型为“{StartupModuleType.FullName}”的模块实例无法找到");
//}
Console.WriteLine("当前启动模块:", module);
modules.Add(module);
var dependeds = module.GetDependedTypes();
foreach (var dependType in dependeds.Where(o => DSAppModule.IsAppModule(o)))
{
var dependModule = Source.ToList().Find(m => m.GetType() == dependType);
if (dependModule == null)
{
throw new Exception($"加载模块{module.GetType().FullName}时无法找到依赖模块{dependType.FullName}");
}
modules.AddIfNotContains(dependModule);
}
return modules;
}
///
/// 创建模块
///
///
///
///
private IDSAppModule CreateModule(IServiceCollection services, Type moduleType)
{
var module = (IDSAppModule)Expression.Lambda(Expression.New(moduleType)).Compile().DynamicInvoke();
services.AddSingleton(moduleType, module);
return module;
}
public virtual void Dispose()
{
}
}