C# 如何将asp.net核心mvc项目拆分为多个程序集(.dll)?
如何将asp.net核心mvc项目拆分为多个程序集(.dll) 我有3个项目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
- MyApp项目
- 控制器
- HomeController.cs
- 模型
- 观点
- 家
- Index.cshtml
- 家
- 控制器
- 人力资源项目
- 控制器
- EmployeeController.cs
- 模型
- EMPLOYEE.cs
- 观点
- 雇员
- Index.cshtml
- 雇员
- 控制器
- ACC项目
- 控制器
- ChartAccountController.cs
- 模型
- ACCOUNT.cs
- 观点
- 图表帐户
- Index.cshtml
- 图表帐户
- 控制器
- 人力资源项目
- HR.dll
- HR.Views.dll
- ACC项目
- ACC.dll
- ACC.Views.dll
然后运行MyApp project也可以访问员工和图表帐户模块。您想要的是不可能的,或者最好说:这肯定不是个好主意 通常,您需要使用Razor类库。所有通用功能都将进入这些RCL。你的整个HR和ACC项目可以是RCL,除非你需要独立运行这些项目,以及完整的web应用程序。在这种情况下,您需要的结构更像:
- 人力资源部
- HR网络应用程序(取决于HR RCL)
- ACC RCL
- ACC网络应用程序(取决于ACC RCL)
- 主应用程序(取决于HR RCL和ACC RCL)
程序
和启动
组成,并且依赖于各自的RCL
有关更多信息,请参阅。***原始答案(更新如下)
如果要执行此操作,需要执行以下两个步骤:
services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
在您拥有的Startup
类的ConfigureServices
方法中
调用以下命令:
services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();
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的所有元素