zwei1121

博客园 首页 新随笔 联系 订阅 管理
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);

}
posted on 2018-05-23 16:32  zwei  阅读(230)  评论(0编辑  收藏  举报