Как разделить основной mvc-проект asp.net на несколько сборок (.dll)? - PullRequest
2 голосов
/ 17 мая 2019

Как разделить основной проект mvc asp.net на несколько сборок (.dll)?

У меня 3 проекта

  • MyApp Project
    • Контроллеры
      • HomeController.cs
    • Модель
    • Просмотров
      • Home
        • Index.cshtml
  • Проект HR

    • Контроллеры
      • EmployeeController.cs
    • Модель
      • EMPLOYEE.cs
    • Просмотров
      • Сотрудник
        • Index.cshtml
  • Проект ACC

    • Контроллеры
      • ChartAccountController.cs
    • Модель
      • Account.cs
    • Просмотров
      • ChartAccount
        • Index.cshtml

Я хочу скомпилировать в dll

  • Проект HR
    • HR.dll
    • HR.Views.dll
  • ACC Project
    • ACC.dll
    • ACC.Views.dll

Я хочу добавить ссылку на эти dll (HR.dll, HR.Views.dll, ACC.dll, ACC.Views.dll) в проект MyApp.

А затем запустить проект MyApp и получить доступ к модулю Account & Chart Account.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

*** Оригинальный ответ (Обновление ниже)

Если вы хотите сделать это, вам нужно выполнить следующие 2 шага:

  1. Вам необходимо загрузить контроллерыиз внешних библиотек

Уже существует решение для этого в stackoverflow: Как использовать контроллер в другой сборке в ASP.NET Core MVC 2.0?

Он говорит следующее:

Внутри ConfigureServices метода класса Startup вы должны вызвать следующее:

services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
Вам нужно загрузить скомпилированные представления Razor, я думаю, это то, что у вас есть в ваших HR.Views.dll и ACC.Views.dll.

Существует также решение дляэто для stackoverflow:

Как использовать CompiledRazorAssemblyPart для загрузки Razor Views?

Загрузка библиотек классов Razor в виде плагинов

Это одно из возможных решений по ссылкам выше:

Что вам нужно сделать, это:

services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.ConfigureApplicationPartManager(ConfigureApplicationParts);

и сконфигурировать детали следующим образом:

    private void ConfigureApplicationParts(ApplicationPartManager apm)
    {
        var rootPath = HostingEnvironment.ContentRootPath;
        var pluginsPath = Path.Combine(rootPath, "Plugins");

        var assemblyFiles = Directory.GetFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);
        foreach (var assemblyFile in assemblyFiles)
        {
            try
            {
                var assembly = Assembly.LoadFile(assemblyFile);
                if (assemblyFile.EndsWith(".Views.dll"))
                    apm.ApplicationParts.Add(new CompiledRazorAssemblyPart(assembly));
                else
                    apm.ApplicationParts.Add(new AssemblyPart(assembly));
            }
            catch (Exception e) { }
        }
    }

Если у вас также есть файлы javascript и css в наших отдельных проектах MVC, вам нужно будет вставить это в dll, иначе ваше основное приложение не увидит его.Таким образом, в вашем проекте HR и ACC вам нужно добавить это в ваш файл .csproj:

  <ItemGroup>
    <EmbeddedResource Include="wwwroot\**" />
  </ItemGroup>

И просто для ясности, я согласен с другими комментариями, я не думаю, что этохорошая архитектура, но это возможно сделать, если вы хотите.

*** Обновлено (работало)

Всего один шаг:

Редактировать Startup.cs в ConfigureServices метод

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2).ConfigureApplicationPartManager(ConfigureApplicationParts);

и метод:

private void ConfigureApplicationParts(ApplicationPartManager apm)
    {
        var rootPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

        var assemblyFiles = Directory.GetFiles(rootPath , "*.dll");
        foreach (var assemblyFile in assemblyFiles)
        {
            try
            {
                var assembly = Assembly.LoadFile(assemblyFile);
                if (assemblyFile.EndsWith(this.GetType().Namespace + ".Views.dll") || assemblyFile.EndsWith(this.GetType().Namespace + ".dll"))
                    continue;
                else if (assemblyFile.EndsWith(".Views.dll"))
                    apm.ApplicationParts.Add(new CompiledRazorAssemblyPart(assembly));
                else
                    apm.ApplicationParts.Add(new AssemblyPart(assembly));
            }
            catch (Exception e) { }
        }
    }
1 голос
/ 17 мая 2019

То, что вы хотите, невозможно, или, может быть, лучше сказать: это не очень хорошая идея, конечно.

В общем, вам нужно использовать библиотеки классов Razor.Вся обычная функциональность затем включается в эти RCL.Все ваши проекты HR и ACC могут быть RCL, если только вам не нужно запускать их независимо, как полноценные веб-приложения.В этом случае вам потребуется структура, похожая на:

  • HR RCL
  • HR Web App (зависит от HR RCL)
  • ACC RCL
  • ACC Web App (зависит от ACC RCL)
  • Главное приложение (зависит от HR RCL и ACC RCL)

В любом случае вы бы поставили все контроллеры,представления и статические ресурсы, которые должны быть использованы в RCL, поэтому, если у вас есть реальные веб-приложения HR / ACC, они будут довольно легкими: в основном они состоят только из Program и Startup и зависят от их соответствующих RCL.

Для получения дополнительной информации см. Документацию о библиотеках классов Razor .

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