其中一些要求是:
我对此有疑问:
@section
帮助添加模块样式,脚本吗?我问这个是因为找不到任何“更新的”答案。我在Mac上的Visual Studio中使用.NET Core 3.0。
根据您的确切要求,有很多不同的方法和策略可以解决这些类型的问题。实际上,已经编写了整个框架来帮助将插件打包,注册和嵌入.NET(例如,参见Managed Extensibility Framework)。
也就是说,我可以为您指明一个可能帮助您解决这些问题的方向。
首先,我要研究Razor类库。这些是在ASP.NET Core 2.1中引入的,并在ASP.NET Core 3.0中进行了扩展。它们使您可以创建包含模型,视图和控制器(在[[ASP.NET Core 2.1中)以及静态资产(例如脚本,图像等)(在ASP.NET Core中3.0)。如果您需要分发这些文件以供多个项目使用,它们甚至可以打包并重新分发为NuGet软件包。
Razor类库中嵌入静态资产,但是默认情况下未启用它,它具有一些限制,并且格式具有在[[ASP.NET Core 3.0中进行了更改。从模块中引用共享的静态内容您的注:从技术上讲,如果需要,可以在ASP.NET Core 2.1
配置对象注册(资源)(资源的位置)并使用该对象来引用那些位置。
从模块内部引用共享的类库无论如何,默认情况下,dependency injection,就像@ jonny-lin在评论中建议的那样。这里的基本思想是建立一个中心类库,您的Razor Class Libraries和您的主应用程序都依赖于该库为每个服务定义接口。您的主应用程序(或其依赖项)将建立这些服务的具体版本。反过来,您的模块取决于这些接口。然后,您可以将这些服务的具体实现注入到您的模块中。
注:有很多实现依赖项注入的策略,从通过
IControllerActivator
手动组装依赖关系图到使用依赖项注入容器,例如内置在ASP]中的策略。 .NET Core
。无论如何,在MVC应用程序中,一般的策略是让控制器通过构造函数接受所需的接口,然后通过主应用程序注入具体的实现。在主应用程序中配置模块最后,您需要建立一种向主应用程序注册模块的方法。如果仅定义可重用的类库,则可能就像引用程序集然后调用其类一样简单。如果它包含基本的MVC应用程序,则它可能已经可用,具体取决于您处理路由的方式-但在许多情况下,您需要为区域设置新的路由。在更复杂的情况下,在模块中创建扩展方法可能很有意义,可以从您的Startup
类调用该扩展方法以处理服务和路由的注册。自动
在主应用程序中发现模块IModuleConfiguration
)的配置类。然后,您的主应用程序将使用反射在所有实现IModuleConfiguration
的已加载程序集中找到所有类,并在每个程序集上调用一种配置方法。该方法几乎肯定需要具有某种形式的依赖项注入,以便每个模块所依赖的依赖项都可以注册为配置的一部分。一个可以帮助实现此类功能的库是Microsoft.Composition
,它是Managed Extensibility Framework
到ASP.NET Core的部分端口。不过,这很快就会变得非常复杂。很明显,实际上实现所有这些可能非常复杂,并且几乎可以肯定会引起很多其他问题,这取决于您对这些方法的熟悉程度。我在此答案中的目标不是解决所有这些可能的情况,而是提出解决此类问题的一般策略。希望这会有所帮助!