У меня есть модульное веб-приложение, и мне нужно загрузить некоторые библиотеки во время выполнения, эти библиотеки будут содержать Controllers
.
Каждый контроллер должен иметь один Area
, и он является общим для всех контроллеров внутриэта библиотека.
Я использовал части приложения ASP.NET Core для загрузки этой сборки во время выполнения.
services.AddMvcCore(setup =>
{
setup.Filters.Add(new AuthorizeFilter());
// Get all global filters
foreach (var filter in GetInterfacesFromAssembly<IGlobalAsyncFilter>())
setup.Filters.Add(new AsyncActionFilterProxy(filter, container));
})
.SetCompatibilityVersion(CompatibilityVersion.Latest)
.AddFormatterMappings()
.AddJsonFormatters()
.AddCors()
.AddAuthorization(o =>
{
o.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
})
.AddApplicationPart(GetModuleAssemblies());
GetModuleAssemblies
получает все возможные библиотеки, вызываемые во время выполнения, которые могут содержать Controllers
/// <summary>
/// Get any DLL that contains "ModularPortal.Modules.*.dll"
/// </summary>
private static IEnumerable<Assembly> GetModuleAssemblies()
{
string location = Assembly.GetEntryAssembly().Location;
string path = Path.GetDirectoryName(location);
DirectoryInfo directory = new DirectoryInfo(path);
FileInfo[] files = directory.GetFiles("ModularPortal.Module*.dll");
foreach (FileInfo file in files)
yield return Assembly.Load(file.Name.Replace(".dll", ""));
}
. При этом следующий контроллер находится в /api/example1/test
:
[AllowAnonymous]
public class Example1Controller : ControllerBase
{
readonly IMembership membership;
public Example1Controller(
IMembership membership
)
{
this.membership = membership;
}
[HttpGet]
public IActionResult Test()
{
return Ok("t1");
}
}
Проблемазаключается в том, что при добавлении ApplicationPart
мне нужно будет использовать AreaAttribute
для идентификации того, что контроллер принадлежит /Area
.
Я хочу универсальный «Конфигуратор модулей», который будет иметь любой контроллер внутри этой библиотекиобщая область.
Я начал с создания интерфейса для идентификации модуля:
public interface IModule
{
string DisplayName { get; }
string RouteName { get; }
void Configure(ModuleConfiguration config);
}
Затем внутри библиотеки я использовал его:
public class Module : IModule
{
public string DisplayName => "Example Module";
public string RouteName => "Ex";
public void Configure(ModuleConfiguration config)
{
throw new NotImplementedException();
}
}
Я хочуиспользовать этот код для настройки всего этого модуля, в том числеРегистрация зоны и контроллера.
В приведенном выше примере после регистрации зоны путь должен быть /api/ex1/example1/test
.
Это будет возможно только в том случае, если я каким-то образом изменил AddApplicationPart
зарегистрировать его сам.
Есть идеи?