由于nopCommerce是模板类型程序,必要的功能需要是:应用范围广泛、功能的强大和根据最终用户的需求,可以把最终用户所需要的功能灵活的集成到nopCommerce程序中,nopCommerce开发者为了满足这些相互矛盾的需求,通过定义不同功能的插件,让最终用户下载这些不同功能的插件并集成到nopCommerce程序中,从而让最终的程序适应用于不同的用户及其该用户灵活定制自己的程序功能,把功能插件集成到主程序中的关键技术实现是:ApplicationPart内置依赖注入中间件。
以插件集成的形成来增加整个程序的功能虽然具有:能够满足大范围的用户,并根据特定的用户需求灵活功能进行定制,但是这些也造就了程序的臃肿和效率的低下;在不断的集成不同功能插件的过程中,极其容易造成整个程序的崩溃,毕竟我们开发的只是一个Web应用程序,而不是一个系统程序,如果使用了ApplicationPart内置依赖注入中间件则造就了一个具有系统程序特性的Web应用程序。由上述因素如果不是大型公司,不是种资源达到一定程度,就不要在应用开发中使用插件,因为达不到这些标准就不可能开发出各项标准都符合基本标准的主程序和插件程序;其次如果应用场景只是针对特定客户,在Web应用程序开发中本人不建议使用ApplicationPart内置依赖注入中间件技术,更好的解决方案是:根据客户需求,在不断版本迭代过程中,把用户不断提出的功能直接内置定义到不同版本的主程序中。
但是ApplicationPart内置依赖注入中间件作为1种特定需求的技术实现,我们还是必须要理解它是怎样在程序中使用的。
1、定义插件类库项:DemoPlugin1。类库项的定义有两种方式:(1)通过类库定义DemoPlugin1项,但是这种方式不能在Views文件夹中新建cshtml(Razor)文件,只能复制Web项中的cshtml(Razor)文件,到该项目的Views文件夹中。 (2)通过Razor类库定义DemoPlugin1项,这样可以直接在DemoPlugin1项Views文件夹中新建cshtml(Razor)文件。nopCommerce程序使用的是第1种方式。
2、插件类库项中的cshtml(Razor)文件,在通过ApplicationPart内置依赖注入中间件集成到主程序时,有3种方式:(1)直把插件类库项中的cshtml(Razor)文件。的定义在插件类库项Views文件夹中,(2)把类库项中的cshtml(Razor)文件定义到主程序项的Views文件夹中,(3)在整个程序执行构建操作时。自动把把插件类库项中的cshtml(Razor)文件,复制到主程序的指定文件夹中,例如:在nopCommerce程序就是把这些cshtml(Razor)文件复制到了“Presentation\Nop.Web\Plugins” 文件夹中。
3、ApplicationPart内置依赖注入中间件插件集成cshtml(Razor)文件的方式也有2种:
1、注意:如果使用.Net(Core)5及其以前的框架版本,可以通过加载插件类库项Views文件夹中所有的cshtml(Razor)文件的动态库文件(xxx.Views.dll)和插件项类库文件通过ApplicationPart内置依赖注入中间件集成到主程序中,从而让主程序拥有插件项所定义的功能。另外也可以在程序构建中把把插件类库项Views文件夹中所有的cshtml(Razor)文件,复制到主程序指定的文件夹中,也可以实现让主程序拥有插件项所定义的功能。
2、注意:如果使用.Net(Core)6框架,不再支持生成xxx.Views.dll文件,所以通过ApplicationPart内置依赖注入中间件集成插件项也只剩下唯一的方法以供选择:即在程序构建时自动把把插件类库项中的cshtml(Razor)文件,复制到主程序的指定文件夹中。
微软给出的原因是(https://docs.microsoft.com/zh-cn/dotnet/core/compatibility/aspnet-core/6.0/razor-compiler-doesnt-produce-views-assembly):
提高使用 Razor 视图的应用程序的生成性能。
允许 Razor 视图参与 Visual Studio 的“热重载”体验。
本人为了简化ApplicationPart内置依赖注入中间件的对插件项的集成实现,把本来需要定义在插件类库项Views文件夹中的cshtml(Razor)文件,直接定义在了主程序的项的Views文件夹中,作为一个简单的示例程序这是可以接受的,但在实现开发中,做为工程性的软件,插件项的cshtml(Razor)文件,最好定义在插件项的的Views文件夹,这样更能体现“插件”的整体性和独立性原则,一个现成的示例:nopCommerce程序就是这么做的。
var builder = WebApplication.CreateBuilder(args);
var assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "DemoPlugin1.dll");
var mvcBuilders = builder.Services.AddMvc();
var controllerAssemblyPart = new AssemblyPart(assembly);
mvcBuilders.ConfigureApplicationPartManager(apm =>
{
apm.ApplicationParts.Add(controllerAssemblyPart);
});
更多、更详细关于ApplicationPart内置依赖注入中间件的技术实现见:“https://www.cnblogs.com/lwqlun/p/11137788.html”。
22-07-29-058_WebApplicationPart(内置依赖注入中间件)。