gpt4 book ai didi

c# - 如何将asp.net core mvc项目分离成多个程序集(.dll)?

转载 作者:太空狗 更新时间:2023-10-30 01:28:51 25 4
gpt4 key购买 nike

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

我有 3 个项目

  • MyApp 项目
    • Controller
      • HomeController.cs
    • 模特
    • 观点
      • 主页
        • Index.cshtml
  • 人力资源项目

    • Controller
      • 员工 Controller .cs
    • 模特
      • 员工.cs
    • 观点
      • 员工
        • Index.cshtml
  • ACC 项目

    • Controller
      • ChartAccountController.cs
    • 模特
      • 帐户.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项目也可以访问Employee & Chart Account模块。

最佳答案

*** 原始答案(更新如下)

如果您想这样做,您需要执行以下 2 个步骤:

  1. 您需要从外部 dll 加载 Controller

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

内容如下:

Inside the ConfigureServices method of the Startup class you have to call the following:

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

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

How CompiledRazorAssemblyPart should be used to load Razor Views?

Loading Razor Class Libraries as plugins

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

What you need to do is:

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

and configure the parts like this

    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>

需要说明的是,我同意其他评论,我认为这不是一个好的架构,但如果您愿意,可以这样做。

*** 更新(工作)

只需一步:

ConfigureServices 方法中编辑 Startup.cs

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

关于c# - 如何将asp.net core mvc项目分离成多个程序集(.dll)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com