修改 CloudProduct ImageCache 项目改为 插件
This commit is contained in:
1 parent
5ff52dea92
commit
292cb8638c
26 files changed
+417
-282
No files matched your search
@@ -1,3 +1,4 @@
|
||||
using MAX.Plugins;
|
||||
using System.Reflection;
|
||||
using MAX.Framework.DependencyInjection;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
@@ -5,6 +6,8 @@ using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||
|
||||
if (args.ElementAtOrDefault(0) == "configuration") { ConfigurationChecks.Run(); return; }
|
||||
|
||||
// Run each scenario in a fresh process: default ALC intentionally cannot unload plugins.
|
||||
var finderType = typeof(ServiceCollectionExtensions).Assembly.GetType("MAX.Framework.DependencyInjection.StoreAppTypeFinder", true)!;
|
||||
var finder = finderType.GetProperty("Current")!.GetValue(null);
|
||||
@@ -36,17 +39,36 @@ var feature = new ControllerFeature();
|
||||
mvc.PartManager.PopulateFeature(feature);
|
||||
if (!feature.Controllers.Any(t => t.Name == "ImageCacheController")) throw new Exception("ImageCache controller missing");
|
||||
if (mode != "image" && !feature.Controllers.Any(t => t.Name == "GoodsController")) throw new Exception("Goods controller missing");
|
||||
if (mode == "image")
|
||||
if (mode is "image" or "plugins")
|
||||
{
|
||||
var host = Host.CreateApplicationBuilder();
|
||||
var core = typeof(ServiceCollectionExtensions).GetMethod("AddStoreCore", BindingFlags.Static | BindingFlags.NonPublic)!;
|
||||
host.Configuration["Search:Url"] = "https://host.invalid";
|
||||
host.Configuration["ImageCache:ConnectionString"] = "host-only";
|
||||
core.Invoke(null, new object[] { host, plugins, new Dictionary<Type, object>() });
|
||||
if (string.IsNullOrEmpty(host.Configuration["ImageCache:ConnectionString"])) throw new Exception("Plugin configuration missing");
|
||||
using var built = host.Build();
|
||||
var image = built.Services.GetRequiredKeyedService<PluginContext>("ImageCache");
|
||||
if (image.Configuration["ImageCache:ConnectionString"] is null or "host-only") throw new Exception("Image config isolation failed");
|
||||
if (image.Configuration["Search:Url"] != null) throw new Exception("Host settings leaked into ImageCache");
|
||||
if (host.Configuration["ImageCache:ConnectionString"] != "host-only") throw new Exception("Plugin modified host configuration");
|
||||
if (mode == "plugins")
|
||||
{
|
||||
var cloud = built.Services.GetRequiredKeyedService<PluginContext>("CloudProduct");
|
||||
if (cloud.Configuration["Search:Url"] is null or "https://host.invalid") throw new Exception("Cloud config isolation failed");
|
||||
if (host.Configuration["Search:Url"] != "https://host.invalid") throw new Exception("Cloud modified host configuration");
|
||||
foreach (var name in new[] { "OpenSearchService", "UserFavoritesIndexService", "RawDataStorage", "GoodsIndexJob", "GoodsService" })
|
||||
{
|
||||
var type = plugins.SelectMany(p => p.GetTypes()).Single(t => t.Name == name);
|
||||
using var scope = built.Services.CreateScope();
|
||||
scope.ServiceProvider.GetRequiredService(type);
|
||||
}
|
||||
}
|
||||
|
||||
if (!host.Services.Any(d => d.ServiceType.Name == "ImageCacheService")) throw new Exception("Plugin DI registration missing");
|
||||
if (!host.Services.Any(d => d.ServiceKey is string key && key == "ImageCacheConnection")) throw new Exception("Startup registration missing");
|
||||
var registeredMvc = host.Services.AddControllers();
|
||||
if (!host.Services.Any(d => d.ServiceKey is string key && key == "ImageCacheConnection")) throw new Exception("Plugin database registration missing");
|
||||
var registeredMvc = built.Services.GetRequiredService<ApplicationPartManager>();
|
||||
var registered = new ControllerFeature();
|
||||
registeredMvc.PartManager.PopulateFeature(registered);
|
||||
registeredMvc.PopulateFeature(registered);
|
||||
if (!registered.Controllers.Any(t => t.Name == "ImageCacheController")) throw new Exception("Core MVC registration missing");
|
||||
}
|
||||
Console.WriteLine($"PASS plugins={plugins.Length}, controllers={feature.Controllers.Count}; dependencies/types loaded" + (mode == "image" ? "; configuration/DI/Startup/MVC registered" : ""));
|
||||
Console.WriteLine($"PASS plugins={plugins.Length}, controllers={feature.Controllers.Count}; dependencies/types loaded" + (mode is "image" or "plugins" ? "; isolated configuration/DI/plugin lifecycle/MVC registered" : ""));
|
||||
Reference in new issue
Block a user