Расширяемое приложение ASP.NET Core 2 - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно создать приложение ASP.NET Core 2, которое может быть расширяемым.

Расширение - это проект, который ссылается на основную сборку и может расширять его, добавляя новые контроллеры, модели (с миграциями EF), представления, бритвенные страницы и т. д.

Поскольку расширения должны использовать базовые классы основного приложения, такие как базовый контроллер, базовая модель или макет представления / страницы, основное приложение не может ссылаться на проект модуля (избегайте циклических ссылок).

Я не уверен, как мне этого добиться, но идея заключается в установке основного проекта, может добавить новые функциональные возможности, просто поместив модули DLL (или через онлайн-маркет в основное приложение, которое загружаетDLL).

В своем исследовании я обнаружил Части приложений , но моя проблема здесь заключается в том, что мне нужно указать сборку деталей в классе запуска, и мне нужно установить емкость инсталляционных модулей безвнесение любых изменений в код.

Некоторые модули тоже должны быть расширяемыми, например,Модуль Untting, необходимо соединиться с банком, и у него есть интерфейс, который определяет методы работы с банком, например:

public interface IBankingOperation
{
    public async void PayInvoiceAsync(Invoice invoice);
    // More methods...
}

Тогда разные проекты могут ссылаться на банковскую сборку и обеспечивать реализацию для разных.банки.

В основном приложении эти модули могут быть установлены как другие модули, но, проверяя базовый модуль, например, я могу установить модуль Сантандера как другой модуль, но только если установлен банковский модуль(зависимость от модуля).

В заключение мне нужно создать модульное приложение ASP.NET Core 2, но основная сборка не может ссылаться на модули, модули должны ссылаться на основную сборку.Модули могут содержать контроллеры, модели, представления, страницы и т. Д.

1 Ответ

0 голосов
/ 09 октября 2018

В основном веб-приложении вы вызываете класс, который загружает расширения в память

ModuleManager.LoadModules(Path.Combine(_env.ContentRootPath, "Modules"));

это функция загрузки модулей

public static void LoadModules(string modulesFolder)
    {
        var appsFolders = new DirectoryInfo(modulesFolder).GetDirectories();

        foreach (var appFolder in appsFolders)
        {
            var binFolder = new DirectoryInfo(Path.Combine(appFolder.FullName, "bin"));
            if (!binFolder.Exists)
            {
                continue;
            }
            var assemblies = AssemblyProvider.GetAssemblies(binFolder.FullName);
            foreach (var assembly in assemblies)
            {
                var iModuleClass = assembly.GetTypes().FirstOrDefault(type => type.GetInterfaces().Contains(typeof(IModule))
                                    && type.GetConstructor(Type.EmptyTypes) != null);
                if (iModuleClass != null)
                {
                    var module = Activator.CreateInstance(iModuleClass) as IModule;
                    module.ModuleFolder = appFolder;
                    Modules.Add(module); 
                    Assemblies.Add(assembly);
                    break;
                }
            }



        }

    }

тогда у вас должен быть интерфейс, который должен быть реализован каждым модулем, класс, который реализует этот интерфейс, должен выполнять работу по регистрации сервисов и моделей баз данных и всего необходимого персонала, и вы загрузите их следующим образом

public static IEnumerable<IExtensionRegister> GetModuleRegistrars()
    {
        lock (Modules)
        {
            return Modules.Select(item => item.Registrar).Where(item=>item!=null).ToList();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...