如何将asp.net核心mvc项目分离为多个程序集(.dll)?

时间:2019-05-17 11:18:58

标签: c# asp.net asp.net-mvc asp.net-core asp.net-core-mvc

如何将asp.net核心mvc项目分离为多个程序集(.dll)?

我有3个项目

  • MyApp项目
    • 控制器
      • HomeController.cs
    • 模型
    • 观看次数
      • 首页
        • Index.cshtml
  • 人力资源项目

    • 控制器
      • EmployeeController.cs
    • 型号
      • EMPLOYEE.cs
    • 观看次数
      • 员工
        • Index.cshtml
  • ACC项目

    • 控制器
      • ChartAccountController.cs
    • 型号
      • ACCOUNT.cs
    • 观看次数
      • ChartAccount
        • Index.cshtml

我想编译成dll

  • 人力资源项目
    • HR.dll
    • HR.Views.dll
  • ACC项目
    • ACC.dll
    • ACC.Views.dll

我想将引用这些dll(HR.dll,HR.Views.dll,ACC.dll,ACC.Views.dll)添加到MyApp Project中。

然后运行MyApp项目也可以访问Employee&Chart Account模块。

2 个答案:

答案 0 :(得分:0)

您想要的是不可能的,或者也许更好地说:这当然不是一个好主意。

通常,您需要使用Razor类库。然后,所有通用功能都将进入这些RCL。您的整个HR和ACC项目都可以是RCL,除非您也需要将它们作为完整的Web应用程序独立运行。在这种情况下,您将需要一个类似以下的结构:

  • HR RCL
  • HR Web App(取决于HR RCL)
  • ACC RCL
  • ACC Web应用程序(取决于ACC RCL)
  • 主应用程序(取决于HR RCL和ACC RCL)

在任何一种情况下,您都需要将所有需要共享的控制器,视图和静态资源都放在RCL中,因此,如果您确实有实际的HR / ACC Web应用程序,那么这些应用程序将很轻巧:大部分仅由ProgramStartup的属性,以及它们各自RCL的依赖性。

有关更多信息,请参见documentation on Razor Class Libraries

答案 1 :(得分:0)

如果要执行此操作,则需要执行以下两个步骤:

  1. 您需要从外部dll加载控制器

在stackoverflow上已经有解决方案:How to use a controller in another assembly in ASP.NET Core MVC 2.0?

它表示以下内容:

  

ConfigureServices类的Startup方法内部   调用以下内容:

services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
  1. 您需要加载编译后的Razor视图,我想这就是您的HR.Views.dll和ACC.Views.dll中的内容。

在stackoverflow上也已经有解决方案:

How CompiledRazorAssemblyPart should be used to load Razor Views?

Loading Razor Class Libraries as plugins

这是上面链接中的一种可能的解决方案:

  

您需要做的是:

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) { }
        }
    }

如果您在我们单独的MVC项目中也有javascript和css文件,则需要将其嵌入到dll中,否则您的主应用程序将看不到它。因此,在您的HR和ACC项目中,您需要将其添加到您的.csproj文件中:

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

为了明确起见,我同意其他意见,我认为这不是一个好的架构,但是如果您愿意,也可以这样做。