看園子里netcore的文章都是簡單的注入幾個服務的例子,在項目中肯定不會一行一行的寫注冊服務的代碼,參考網上,找到一些解決方案,根據自己實際需求進行更改,特記錄下來。
先創建一個 Startup.cs 擴展類,對IServiceCollection進行擴展
public static class IServiceCollectionExtenions
{
/// <summary>
/// 獲取程序集中的類
/// </summary>
/// <param name="assemblyName">程序集名</param>
/// <returns></returns>
private static Dictionary<Type, Type> GetClassName(string assemblyName)
{
var result = new Dictionary<Type, Type>();
if (!string.IsNullOrWhiteSpace(assemblyName))
{
//排除程序程序集中的接口、私有類、抽象類
Assembly assembly = Assembly.Load(assemblyName);
var typeList = assembly.GetTypes().Where(t => !t.IsInterface && !t.IsSealed && !t.IsAbstract).ToList();
//歷遍程序集中的類
foreach (var item in typeList)
{
//查找當前類繼承且包含當前類名的接口
var interfaceType = item.GetInterfaces().Where(o => o.Name.Contains(item.Name)).FirstOrDefault();
if (interfaceType != null)
{
//把當前類和繼承接口加入Dictionary
result.Add(item, interfaceType);
}
}
}
return result;
}
/// <summary>
/// 批量注冊
/// </summary>
/// <param name="services"></param>
/// <param name="assemblyName">程序集名</param>
/// <param name="lifetime">服務生命周期
</param>
public static void BatchRegisterService(this IServiceCollection services, string assemblyName, ServiceLifetime lifetime = ServiceLifetime.Scoped)
{
foreach (var item in GetClassName(assemblyName))
{
//根據生命周期注冊
switch (lifetime)
{
case ServiceLifetime.Scoped:
services.AddScoped(item.Value, item.Key);
break;
case ServiceLifetime.Singleton:
services.AddSingleton(item.Value, item.Key);
break;
case ServiceLifetime.Transient:
services.AddTransient(item.Value, item.Key);
break;
}
}
}
}
然后在 Startup.cs 中服務注冊
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); #region 依賴注冊
//泛型注冊 services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); services.AddScoped<IRepositoryFactory, RepositoryFactory>(); //按程序集名稱批量注冊 services.BatchRegisterService("Com.Service"); #endregion }
經測試 ,使用擴展批量注冊的方式注冊的服務類正常工作