如何创建模块化.NET Core MVC应用程序?

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

其中一些要求是:

  • 集中在主应用程序(“主”)中的可重用功能
  • 将模块加载/卸载到主应用程序中,并使用这些模块中的主要功能。例如,在main中,我们具有数据库连接,因此AB,…模块可以使用此数据库。
  • 每个模块可以有自己的模型,控制器和视图。此外,它可能具有自己的文件,例如样式,脚本或素材资源(图像,字体或其他内容)。

我对此有疑问:

  • 如何实现此模块化结构?
  • 如何将这些模块中的文件(脚本,图像等)加载到主应用程序中?
  • 模块可以有自己的布局吗?
  • 可以使用@section帮助添加模块样式,脚本吗?
  • Vue可以在主应用程序中使用,也可以由模块使用吗?

我问这个是因为找不到任何“更新的”答案。我在Mac上的Visual Studio中使用.NET Core 3.0。

asp.net-core-mvc visual-studio-mac .net-core-3.0
1个回答
0
投票

根据您的确切要求,有很多不同的方法和策略可以解决这些类型的问题。实际上,已经编写了整个框架来帮助将插件打包,注册和嵌入.NET(例如,参见Managed Extensibility Framework)。

也就是说,我可以为您指明一个可能帮助您解决这些问题的方向。

将MVC应用作为模块分发

首先,我要研究Razor类库。这些是在ASP.NET Core 2.1中引入的,并在ASP.NET Core 3.0中进行了扩展。它们使您可以创建包含模型,视图和控制器(在[[ASP.NET Core 2.1中)以及静态资产(例如脚本,图像等)(在ASP.NET Core中3.0)。如果您需要分发这些文件以供多个项目使用,它们甚至可以打包并重新分发为NuGet软件包。

注:从技术上讲,如果需要,可以在ASP.NET Core 2.1

Razor类库中嵌入静态资产,但是默认情况下未启用它,它具有一些限制,并且格式具有在[[ASP.NET Core 3.0中进行了更改。从模块中引用共享的静态内容您的

Razor类库

可以从您的主应用程序调用任何静态资源或视图,尽管这并不是最佳实践,因为这意味着在特定项目之外建立对资源的硬编码依赖性,这使得很难更改这些文件的位置,或测试它们是否甚至指向正确的位置。更好的选择可能是向

配置对象注册(资源)(资源的位置)并使用该对象来引用那些位置。

从模块内部引用共享的类库无论如何,默认情况下,

Razor类库

将无法调用主应用程序中包含的类。解决此问题的方法是使用

dependency injection,就像@ jonny-lin在评论中建议的那样。这里的基本思想是建立一个中心类库,您的Razor Class Libraries和您的主应用程序都依赖于该库为每个服务定义接口。您的主应用程序(或其依赖项)将建立这些服务的具体版本。反过来,您的模块取决于这些接口。然后,您可以将这些服务的具体实现注入到您的模块中。

注:
有很多实现依赖项注入的策略,从通过IControllerActivator手动组装依赖关系图到使用

依赖项注入容器,例如内置在ASP]中的策略。 .NET Core

。无论如何,在MVC应用程序中,一般的策略是让控制器通过构造函数接受所需的接口,然后通过主应用程序注入具体的实现。在主应用程序中配置模块最后,您需要建立一种向主应用程序注册模块的方法。如果仅定义可重用的类库,则可能就像引用程序集然后调用其类一样简单。如果它包含基本的MVC应用程序,则它可能已经可用,具体取决于您处理路由的方式-但在许多情况下,您需要为区域设置新的路由。在更复杂的情况下,在模块中创建扩展方法可能很有意义,可以从您的Startup类调用该扩展方法以处理服务和路由的注册。

自动

在主应用程序中发现模块

当然,如果您希望主应用程序自动检测并配置模块,这将变得有些棘手。在这种情况下,您很可能最终会在每个模块中建立一个实现预定接口(例如IModuleConfiguration)的配置类。然后,您的主应用程序将使用反射在所有实现IModuleConfiguration的已加载程序集中找到所有类,并在每个程序集上调用一种配置方法。该方法几乎肯定需要具有某种形式的依赖项注入,以便每个模块所依赖的依赖项都可以注册为配置的一部分。一个可以帮助实现此类功能的库是Microsoft.Composition,它是

Managed Extensibility Framework

到ASP.NET Core的部分端口。不过,这很快就会变得非常复杂。很明显,实际上实现所有这些可能非常复杂,并且几乎可以肯定会引起很多其他问题,这取决于您对这些方法的熟悉程度。我在此答案中的目标不是解决所有这些可能的情况,而是提出解决此类问题的一般策略。希望这会有所帮助!
© www.soinside.com 2019 - 2024. All rights reserved.