public static IDictionary<Type, Type> GetClosedTypesRegistrations(Type openGeneric, params Assembly[] assemblies)
{
if (assemblies == null || assemblies.Length == 0)
{
return new Dictionary<Type, Type>();
}
return assemblies
.Where(a => !a.IsDynamic)
.SelectMany(ReflectionUtils.GetExportedTypes)
.SelectMany(t => t.GetInterfaces(), (t, i) => new { service = i, type = t } )
.Where(r => r.service.IsGenericType && r.service.GetGenericTypeDefinition() == openGeneric)
.ToDictionary(r => r.service, r => r.type);
}
Inside ConfigureServices
:
var requestHandlers = ReflectionUtils.GetClosedTypesRegistrations(typeof(IRequestHandler<,>), assemblies); foreach (var requestHandler in requestHandlers) { serviceCollection.AddScoped(requestHandler.Key, requestHandler.Value); }
public void ConfigureServices(IServiceCollection services)
{
string strValue = Configuration.GetSection("Appsetings").GetSection("key").Value;
foreach (var item in GetClassName(strValue))
{
foreach (var typeArray in item.Value)
{
services.AddScoped(typeArray, item.Key);
}
}
services.AddMvc();
}
private static Dictionary<Type, Type[]> GetClassName(string assemblyName)
{
if (!String.IsNullOrEmpty(assemblyName))
{
Assembly assembly = Assembly.Load(assemblyName);
List<Type> ts = assembly.GetTypes().ToList();
var result = new Dictionary<Type, Type[]>();
foreach (var item in ts.Where(s => !s.IsInterface))
{
var interfaceType = item.GetInterfaces();
if (item.IsGenericType) continue;
result.Add(item, interfaceType);
}
return result;
}
return new Dictionary<Type, Type[]>();
}
IEnumerable<Type> serviceList = ReflectionHelper.GetSubTypes<IServiceRegister>();
foreach (Type type in serviceList)
{
IServiceRegister register = ReflectionHelper.CreateInstance(type)
as IServiceRegister;
register.Register(services);
}