/// <summary> /// Allows you to configure additonal options for the shell for modules. /// </summary> /// <param name="configure"></param> /// <returns></returns> public ModuleOptionsBuilder<TTenant> ConfigureModuleShellOptions<TModule>(Action<ModuleShellOptionsBuilder<TTenant, TModule>> configure) where TModule : IModule { var factory = new DelegateModuleShellFactory<TTenant, TModule>((t, m) => { var builder = new ModuleShellOptionsBuilder<TTenant, TModule>(t, m); configure(builder); var moduleShellOptions = builder.Build(); return new ModuleShell<TModule>(m, moduleShellOptions); }); // Add a service to the host container that can be used get the ModuleShell for a tenant's module. _parentOptions.ContainerBuilderOptions.Builder.Services.AddSingleton<IModuleShellFactory<TTenant, TModule>>(factory); return this; }
/// <summary> /// /// </summary> /// <param name="defaultRouteHandler">The default route handler to use when no module route match.</param> /// <returns></returns> public ModuleRegisterBuilder <TModule> Build(Action <ModuleShellOptionsBuilder <TModule> > configureModuleOptionsBuilder, IRouteHandler defaultRouteHandler) { var services = ParentBuilder.Services; services.AddSingleton <IModuleManager <TModule>, ModuleManager <TModule> >((sp) => { var routeHandler = DefaultRouteHandler ?? sp.GetRequiredService <MvcRouteHandler>(); var allModules = sp.GetServices <TModule>(); var modulesRouter = new ModulesRouter <TModule>(routeHandler); var moduleManager = new ModuleManager <TModule>(modulesRouter); // shared modules all popualte the same service collection // var services = new ServiceCollection(); foreach (var item in allModules) { var moduleOptionsBuilder = new ModuleShellOptionsBuilder <TModule>(item); configureModuleOptionsBuilder(moduleOptionsBuilder); var moduleShellOptions = moduleOptionsBuilder.Build(); var routedModule = item as IRoutedModule; if (routedModule != null) // these need to be routed. { // modulesRouter. // var routedModuleOptions = moduleShellOptions as ModuleShellOptions<IRoutedModule>; var routedModuleShell = new RoutedModuleShell <TModule>(item, moduleShellOptions, modulesRouter); // var moduleShell = routedModuleShell as IModuleShell<TModule>; moduleManager.AddModule(routedModuleShell); } else { var nonRoutedModuleShell = new ModuleShell <TModule>(item, moduleShellOptions); // var moduleShell = routedModuleShell as IModuleShell<TModule>; moduleManager.AddModule(nonRoutedModuleShell); } } return(moduleManager); }); return(ParentBuilder); }
public void OnSetupModule(Action <ModuleShellOptionsBuilder <TModule> > configureModuleOptionsBuilder) { Services.AddSingleton <IModuleManager <TModule>, ModuleManager <TModule> >((sp) => { var routeHandler = DefaultRouteHandlerFactory(); var modulesRouter = new ModulesRouter <TModule>(routeHandler); var allModules = sp.GetServices <TModule>(); var moduleManager = new ModuleManager <TModule>(modulesRouter); foreach (var item in allModules) { var moduleOptionsBuilder = new ModuleShellOptionsBuilder <TModule>(item); configureModuleOptionsBuilder(moduleOptionsBuilder); var moduleShellOptions = moduleOptionsBuilder.Build(); var moduleShell = new ModuleShell <TModule>(item, moduleShellOptions); moduleManager.AddModule(moduleShell); } return(moduleManager); }); }