/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public IApplicationBuilder Invoke <T>() where T : class { var menuService = _appBuilder.ApplicationServices.GetService <IMenuService>(); if (menuService != null) { var asms = AssemblyTools.LoadAssembliesThatImplements <T>(_folderPath); var t = typeof(Controller); var tMethod = typeof(IActionResult); var tModule = typeof(IWeeModule); foreach (var asm in asms) { var moduleType = asm.GetTypes().FirstOrDefault(i => !i.GetTypeInfo().IsInterface&& tModule.IsAssignableFrom(i)); var module = AssemblyTools.CreateInstance <IWeeModule>(moduleType); var rootMenuDefaultTitle = module?.RootMenuDefaultTitle; var controllers = asm.GetTypes().Where(i => !i.GetTypeInfo().IsInterface && t.IsAssignableFrom(i)) .ToList(); foreach (var controller in controllers) { var methods = controller.GetMethods(BindingFlags.Instance | BindingFlags.Public) .Where(m => !m.IsVirtual && tMethod.IsAssignableFrom(m.ReturnType) && m.GetCustomAttribute <MenuAttribute>() != null) .ToList(); foreach (var method in methods) { var menuAttr = method.GetCustomAttribute <MenuAttribute>(); var routeAttr = method.GetCustomAttribute <RouteAttribute>(); IMenuItem menu; var category = string.IsNullOrWhiteSpace(rootMenuDefaultTitle) ? menuAttr.Category : rootMenuDefaultTitle; if (routeAttr == null) { menu = new MenuItem(controller.Name, method.Name, menuAttr.Parent, menuAttr.Title, menuAttr.Hint, menuAttr.Order, menuAttr.Icon); } else { menu = new MenuItem(routeAttr.Name, menuAttr.Parent, menuAttr.Title, menuAttr.Hint, menuAttr.Order, menuAttr.Icon); } var categoryOrder = module?.Order ?? menuAttr.CategoryOrder ?? 9999; menuService.RegisterMenu(categoryOrder, category, menu); } } } } return(_appBuilder); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> protected List <IFileProvider> LoadProviders <T>() { var moduleAsms = AssemblyTools.LoadAssembliesThatImplements <T>(_folderPath); var providers = new List <IFileProvider>(); var type = typeof(T); foreach (var moduleAsm in moduleAsms) { var ns = AssemblyTools.GetDefaultNamespace(moduleAsm); if (string.IsNullOrWhiteSpace(ns)) { var asmName = moduleAsm.GetName().Name; throw new BaseComponentLoadException($"'{nameof(DefaultNamespaceAttribute)}' was not found on type {asmName}. Consider add attribute on {type.Name} class implementation (e.g. [assembly: DefaultNamespace(nameof({asmName}))])"); } var embeddedFileProvider = new EmbeddedFileProvider(moduleAsm, ns); providers.Add(embeddedFileProvider); } return(providers); }