Область регистрации и контроллеры динамически - PullRequest
0 голосов
/ 25 июня 2018

У меня есть модульное веб-приложение, и мне нужно загрузить некоторые библиотеки во время выполнения, эти библиотеки будут содержать Controllers.

Каждый контроллер должен иметь один Area, и он является общим для всех контроллеров внутриэта библиотека.

Example1

Я использовал части приложения 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зарегистрировать его сам.

Есть идеи?

1 Ответ

0 голосов
/ 25 июня 2018

Похоже, вы пытаетесь построить модульный проект, как я.Вот ссылка ссылка для вас.

Надеюсь, это поможет, если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.Я хотел бы поддержать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...