using AutoMapper;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Yuebon.Commons.Repositories;
using Yuebon.Commons.IoC;
using Yuebon.Commons.Linq;
using Yuebon.Commons.Log;
namespace Yuebon.Commons.Module
{
///
/// 模块服务
///
public class MoudleService
{
///
/// 实现应用模块程序集的注册服务
///
///
///
public static IServiceProvider LoaderMoudleService(IServiceCollection services)
{
// services.AddScoped(typeof(IUnitOfWork), typeof(UnitOfWork));
var apps = AppContext.BaseDirectory + "Apps";
if (!Directory.Exists(apps))
{
Directory.CreateDirectory(apps);
}
// 把 Apps 下的动态库拷贝一份来运行,
// 使 Apps 中的动态库不会在运行时被占用(以便重新编译)
var targetPath = PrepareShadowCopies();
// 从 Shadow Copy 目录加载 Assembly 并注册到 Mvc 中
//LoadFromShadowCopies(targetPath);
string PrepareShadowCopies()
{
// 准备 Shadow Copy 的目标目录
var target = Path.Combine(AppContext.BaseDirectory, "app_data", "apps-cache");
if (!Directory.Exists(target))
{
Directory.CreateDirectory(target);
}
// 找到插件目录下 bin 目录中的 .dll,拷贝
Directory.EnumerateDirectories(apps)
.Select(path => Path.Combine(path, "bin"))
.Where(Directory.Exists)
.SelectMany(bin => Directory.EnumerateFiles(bin, "*.dll"))
.ForEach(dll => File.Copy(dll, Path.Combine(target, Path.GetFileName(dll)), true));
return target;
}
DirectoryInfo folder = new DirectoryInfo(targetPath);
List myAssembly = new List();
myAssembly.Add(Assembly.Load("Yuebon.Security.Core"));
if (File.Exists(AppContext.BaseDirectory+ "Yuebon.Messages.Core.dll"))
{
myAssembly.Add(Assembly.Load("Yuebon.Messages.Core"));
}
foreach (FileInfo finfo in folder.GetFiles("*.Core.dll"))
{
try
{
myAssembly.Add(Assembly.LoadFrom(finfo.FullName));
string dllNamespaceStr = finfo.Name.Substring(0, finfo.Name.IndexOf(".Core"));
IoCContainer.RegisterFrom(finfo.FullName);
IoCContainer.RegisterLoadFrom(finfo.FullName, dllNamespaceStr);
Log4NetHelper.Info("注入应用模块" + finfo.Name + "成功");
}
catch (Exception ex)
{
Log4NetHelper.Error("注入应用模块" + finfo.Name + "失败\r\n" , ex);
}
}
services.AddAutoMapper(myAssembly);
services.AddScoped();
return IoCContainer.Build(services);
}
}
}