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

C# 如何将asp.net核心mvc项目拆分为多个程序集(.dll)?,c#,asp.net,asp.net-mvc,asp.net-core,asp.net-core-mvc,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 观点 图表帐户 Index.csh

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

我有3个项目

  • MyApp项目
    • 控制器
      • HomeController.cs
    • 模型
    • 观点
        • Index.cshtml
  • 人力资源项目

    • 控制器
      • EmployeeController.cs
    • 模型
      • EMPLOYEE.cs
    • 观点
      • 雇员
        • Index.cshtml
  • ACC项目

    • 控制器
      • ChartAccountController.cs
    • 模型
      • ACCOUNT.cs
    • 观点
      • 图表帐户
        • 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项目中


然后运行MyApp project也可以访问员工和图表帐户模块。

您想要的是不可能的,或者最好说:这肯定不是个好主意

通常,您需要使用Razor类库。所有通用功能都将进入这些RCL。你的整个HR和ACC项目可以是RCL,除非你需要独立运行这些项目,以及完整的web应用程序。在这种情况下,您需要的结构更像:

  • 人力资源部
  • HR网络应用程序(取决于HR RCL)
  • ACC RCL
  • ACC网络应用程序(取决于ACC RCL)
  • 主应用程序(取决于HR RCL和ACC RCL)
在任何一种情况下,您都会将所有需要共享的控制器、视图和静态资源放在RCL中,因此,如果您确实有实际的HR/ACC web应用程序,那么这些应用程序将非常简单:它们主要由
程序
启动
组成,并且依赖于各自的RCL

有关更多信息,请参阅。

***原始答案(更新如下) 如果要执行此操作,需要执行以下两个步骤:

  • 您需要从外部DLL加载控制器
  • stackoverflow上已存在此问题的解决方案:

    它说:

    services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
    
    在您拥有的
    Startup
    类的
    ConfigureServices
    方法中 调用以下命令:

    services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
    
  • 您需要加载已编译的Razor视图,我想这就是您的HR.views.dll和ACC.views.dll中的内容
  • 对于stackoverflow,也已经有了一个解决方案:

    这是一个可能的解决方案,可以从上面的链接中找到:

    您需要做的是:

    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>
    
    方法:

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

    但是,你将如何管理路由和所有如果所有的事情都是单独的项目,我真的很想知道这个问题的答案。顺便问一下,为什么场景是这样的,为什么你不能对每个模块都有特定的区域。我想这样做是因为我认为,当一个开发人员只编译并粘贴到IIS文件夹中时,很容易将不同的开发人员分开。MVC本身带有关注点的分离,但你也在分离关注点。但我不确定这是否可行,因为您可能需要妥善处理路由和所有问题。取而代之的是,为什么你不能在MVC中找到一些地方并加以利用呢。这导致跟踪性差。相反,您应该设置一个适当的构建和发布管道,使您的团队能够在不中断的情况下进行部署,并使您能够完全跟踪在什么环境中发生的更改。如何将项目与不同的开发人员分离?或者我需要巩固项目非常时间?代码在您的答案是不工作的。但是我可以编辑你的代码来工作。非常感谢你引导我。我想在你的答案上打绿色,但你的代码需要更改。我在你的问题中没有看到任何代码,因此我无法给你确切的代码作为回答,这就是为什么我从其他stackoverflow答案中复制代码,以便指导你如何解决问题。这只是一个框架,基于此,你应该能够解决你的问题。谢谢你,我编辑了你的答案,在你的答案下面添加了一个工作解决方案,但需要“同行评审”。完成更改后,我将勾选验证答案。奇怪的是,为什么必须在sep dll中拥有视图这一点是为了减少dll的数量,以便插件可以组合mvc@Sophairk的所有元素