https://blog.csdn.net/u012404594/article/details/105873601
1.Core文件夹里General.Core添加l类库文件夹Librs→添加类 RuntimeHelpers.cs
namespace General.Core.Librs
{
public class RuntimeHelper
{
public static Assembly GetAssemblyByName(string assemblyName)
{
return AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyName));
}
}
}
2.Startup类
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDbContextPool<GeneralDbContext>(options =>
options.UserSqlServer(Configuration.GetConnectionString("DefaultConnectionString")));
services.AddAuthentication();//添加权限的过滤
// services.AddScoped<ICategoryServices, CategoryService>();//把服务注入进来,就可以对数据库操作了,跳到服务类
// services.AddScoped<ISettingService, SettingService>();
var assembly = RuntimeHelper.GetAssemblyByName("General.Services");
var types = assembly.GetTypes();
var list = types.Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericType).ToList();
foreach(var type in list)
{
var interfaceList =types.GetInterfaces();
if(interfaceList.Any())
{
var intera = interfaceList.First();
services.AddScoped(interfaceList, type);
}
}
}
3.把原来的多个服务注释掉。
把新加的后面代码放到另外一个文件夹里
General.Core→Extensions文件夹→添加扩展类ServicesCollectionExtensions.cs
namespace General.Core.Extensions
{
public static class ServicesCollectionExtensions
{
public static void AddAssembly(this IServiceCollection service,string assemblyName,ServiceLifetime serviceLifetime=ServiceLifetime.Scoped)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services) + "为空");
}
if (String.IsNullOrEmpty(assemblyName) )
{
throw new ArgumentNullException(nameof(assemblyName) + "为空");
}
var assembly = RuntimeHelper.GetAssemblyByName(assemblyName);
if (assembly == null)
{
throw new ArgumentNullException(nameof(assembly) + "dll不存在");
}
// var assembly = RuntimeHelper.GetAssemblyByName("General.Services");
var types = assembly.GetTypes();
var list = types.Where(o => o.IsClass && !o.IsAbstract && !o.IsGenericType).ToList();
if (list != null && !list.Any())
return;
foreach (var type in list)
{
var interfaceList = type.GetInterfaces();
if (interfaceList == null ||! interfaceList.Any())
continue;
if (interfaceList.Any())
{
var inter = interfaceList.First();
switch(serviceLifetime)
{
case ServiceLifetime.Scoped:
services.AddScoped(inter, type);
break;
case ServiceLifetime.Singleton:
services.AddSingleton(inter, type);
break;
case ServiceLifetime.Transient:
services.AddTransient(inter, type);
break;
}
}
}
}
}
}