// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddOptions(); services.Configure <ConnectionStringSetting>(Configuration.GetSection("ConnectionStringSetting")); services.AddScoped <IPluginManager, PluginManager>(); services.AddScoped <IUnitOfWork, UnitOfWork>(); var mvcBuilders = services.AddMvc() .AddRazorRuntimeCompilation(o => { foreach (var item in _presets) { o.AdditionalReferencePaths.Add(item); } AdditionalReferencePathHolder.AdditionalReferencePaths = o.AdditionalReferencePaths; }); services.Configure <RazorViewEngineOptions>(o => { o.AreaViewLocationFormats.Add("/Modules/{2}/Views/{1}/{0}" + RazorViewEngine.ViewExtension); o.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml"); }); services.AddSingleton <IActionDescriptorChangeProvider>(MyActionDescriptorChangeProvider.Instance); services.AddSingleton(MyActionDescriptorChangeProvider.Instance); var provider = services.BuildServiceProvider(); using (var scope = provider.CreateScope()) { var option = scope.ServiceProvider.GetService <MvcRazorRuntimeCompilationOptions>(); var unitOfWork = scope.ServiceProvider.GetService <IUnitOfWork>(); var allEnabledPlugins = unitOfWork.PluginRepository.GetAllEnabledPlugins(); foreach (var plugin in allEnabledPlugins) { var context = new CollectibleAssemblyLoadContext(); var moduleName = plugin.Name; var filePath = $"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}\\{moduleName}.dll"; _presets.Add(filePath); using (var fs = new FileStream(filePath, FileMode.Open)) { var assembly = context.LoadFromStream(fs); var controllerAssemblyPart = new MyAssemblyPart(assembly); mvcBuilders.PartManager.ApplicationParts.Add(controllerAssemblyPart); PluginsLoadContexts.AddPluginContext(plugin.Name, context); } } } }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.Configure <CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddOptions(); services.Configure <ConnectionStringSetting>(Configuration.GetSection("ConnectionStringSetting")); services.AddScoped <IPluginManager, PluginManager>(); services.AddScoped <IUnitOfWork, UnitOfWork>(); var mvcBuilders = services.AddMvc(); mvcBuilders.AddMvcOptions(o => o.EnableEndpointRouting = false); services.Configure <RazorViewEngineOptions>(o => { o.AreaViewLocationFormats.Add("/Modules/{2}/Views/{1}/{0}" + RazorViewEngine.ViewExtension); o.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml"); }); services.AddSingleton <IActionDescriptorChangeProvider>(MyActionDescriptorChangeProvider.Instance); services.AddSingleton(MyActionDescriptorChangeProvider.Instance); var provider = services.BuildServiceProvider(); using (var scope = provider.CreateScope()) { var unitOfWork = scope.ServiceProvider.GetService <IUnitOfWork>(); var allEnabledPlugins = unitOfWork.PluginRepository.GetAllEnabledPlugins(); foreach (var plugin in allEnabledPlugins) { var context = new CollectibleAssemblyLoadContext(); var moduleName = plugin.Name; using (var fs = new FileStream($"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}\\{moduleName}.dll", FileMode.Open)) { var assembly = context.LoadFromStream(fs); var controllerAssemblyPart = new AssemblyPart(assembly); mvcBuilders.PartManager.ApplicationParts.Add(controllerAssemblyPart); } PluginsLoadContexts.AddPluginContext(plugin.Name, context); } } }