为多个应用程序重用 .NET Core Web 应用程序项目

问题描述 投票:0回答:1

我有以下内容:

  • 包含 Quartz.NET Scheduler 的 ASP .NET Core Web 应用程序项目
  • 客户 A 的应用项目 A,包括服务和 Quartz.NET 工作等
  • 客户 B 的应用项目 B,包括服务和 Quartz.NET 工作等

.NET Core Web 应用程序项目用于拥有一个 GUI,用于编辑作业、查看日志、应用数据库迁移等。

应用程序项目(A 和 B)包含不相关的功能,但两者都应该能够使用调度程序和 Web 应用程序来编辑作业等。

是否有可能以这种方式修改 Web 应用程序项目,即我只能拥有一次代码,然后从两个应用程序项目中“使用”它。比如:

builder.Services.AddMyWebApplication();
...
app.UseMyWebApplication();

或者我拥有一次 Web 应用程序项目并添加插件等应用程序项目(无需事先引用它们)?

c# asp.net-core architecture
1个回答
0
投票

这是我目前所了解的,就依赖关系而言(对基本图表示歉意,箭头显示依赖关系 - 例如项目 A“依赖”核心应用程序和 Quartz.Net)。

在核心应用程序中,您有 UI 和逻辑 - 我假设“插件”应用程序(A 和 B)仅集成在核心应用程序的逻辑层。 如果不是这种情况,请告知。

High-level current state diagram

关于你的问题:

是否有可能以这种方式修改Web应用程序项目, 我只能拥有一次代码,然后从两者中“使用”它 应用项目

...还有...

或者我有一次 Web 应用程序项目并添加 像插件这样的应用程序项目(无需同时引用 事先)?

是的。 我认为这基本上是您所需要的 - 让我给您一个图表和一些解释:

Future state, with modified core internals & dependencies.

我假设核心应用程序的内部逻辑是分层排列的(如果不是,你应该考虑随着时间的推移朝这个方向发展)。 将所有核心逻辑放入一个层中,然后可由 UI 和“插件”项目重用。

理想情况下,这个核心逻辑层不应该对数据库技术或 Quartz.Net 等“外部”有任何依赖 - 我所包含的

Scheduling Interface
是某种代码级接口/合约/依赖注入机制的简写,因此你的核心逻辑没有绑定到 Quartz.Net。 您没有在问题中明确要求这一点,但您可能需要考虑这样做。

必要的部分是避免将插件项目绑定到您的核心逻辑和 Quartz.Net,因为有一天这可能会困扰您。 当插入项目 A 或 B(或 C、D、...Z)时,如果它们只需与您控制的接口集成,就会更容易。 您需要编写的所有 Quartz.Net 逻辑都可以编写一次,而不是在插件项目中编写/重复太多内容。

旁注:如果您了解端口和适配器架构风格(又名六角形),那么与 Quartz.Net 的“对话”将是端口/适配器。 同样的方法也用在 Clean 架构风格中。

您问题的另一部分是关于如何集成插件项目。 我图表上的

A/B Interface
就是这个的简写。

您将设计一个或多个代码级 API(核心逻辑类上的公共方法),这些 API 是专门为要使用的插件项目而设计的。 我不知道您的应用程序到底是做什么的 - 您可能有一个或多个 API,请参阅:接口隔离原则

这将允许您使用单独的解决方案来做到这一点:

  • 核心解决方案:仅包含开发和测试核心应用程序所需的项目。 明确不包含项目 A 或 B 代码。 可以包含用于测试 A/B 接口的模拟/测试工具代码。
  • 项目A解决方案:使用核心解决方案的“输出”。唯一的“发展”是项目 A 的特定逻辑/部分。
  • 项目 B 溶液:冲洗并重复项目 A 溶液,但用于项目 B。

根据您的情况,该架构将允许您开发插件应用程序,然后可以独立部署和并行运行,因此插件项目以及核心应用程序的开发和部署是完全独立的。耦合。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.