当前位置:网站首页>第59章 ApplicationPart内置依赖注入中间件
第59章 ApplicationPart内置依赖注入中间件
2022-08-01 19:35:00 【zhoujian_911】
由于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(内置依赖注入中间件)。
边栏推荐
- Redis的内存淘汰策略和过期删除策略的区别是什么
- SENSORO成长伙伴计划 x 怀柔黑马科技加速实验室丨以品牌力打造To B企业影响力
- 对于web性能优化我有话说!
- The solution to the vtk volume rendering code error (the code can run in vtk7, 8, 9), and the VTK dataset website
- 面试必问的HashCode技术内幕
- 数据库系统原理与应用教程(071)—— MySQL 练习题:操作题 110-120(十五):综合练习
- 【Redis】缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存击穿、缓存降级
- 智能硬件开发怎么做?机智云全套自助式开发工具助力高效开发
- 【1374. 生成每种字符都是奇数个的字符串】
- 八百客、销售易、纷享销客各行其道
猜你喜欢

开源视界 | StreamNative 盛宇帆:和浪漫的人一起做最浪漫的事

From ordinary advanced to excellent test/development programmer, all the way through

#yyds干货盘点# 面试必刷TOP101: 链表中倒数最后k个结点

Win11如何删除升级包?Win11删除升级包的方法

Redis的内存淘汰策略和过期删除策略的区别是什么

DAO开发教程【WEB3.0】
![57: Chapter 5: Develop admin management services: 10: Develop [get files from MongoDB's GridFS, interface]; (from GridFS, get the SOP of files) (Do not use MongoDB's service, you can exclude its autom](/img/e1/2fa8dcc9c246bbbc2494326a83cda1.png)
57: Chapter 5: Develop admin management services: 10: Develop [get files from MongoDB's GridFS, interface]; (from GridFS, get the SOP of files) (Do not use MongoDB's service, you can exclude its autom

网络不通?服务丢包?这篇 TCP 连接状态详解及故障排查,收好了~

win10,在proe/creo中鼠标中键不能放大缩小

即时通讯开发移动端弱网络优化方法总结
随机推荐
Write code anytime, anywhere -- deploy your own cloud development environment based on Code-server
easyUI中datagrid中的formatter里面向后台发送请求获取数据
JS数组过滤
XSS靶场中级绕过
重保特辑|拦截99%恶意流量,揭秘WAF攻防演练最佳实践
安装GBase 8c数据库的时候,报错显示“Resource:gbase8c already in use”,这怎么处理呢?
kubernetes - deploy nfs storage class
modbus总线模块DAM-8082
TestNG multiple xml for automated testing
Source code analysis of GZIPOutputStream class
MySQL开发技巧——存储过程
18、分布式配置中心nacos
在全志V853开发板试编译QT测试
odoo coding conventions (programming conventions, coding guidelines)
Keras深度学习实战——交通标志识别
30天刷题计划(五)
SQL的 ISNULL 函数
GBase 8c中怎么查询数据库配置参数,例如datestyle。使用什么函数或者语法呢?
#yyds dry goods inventory# Interview must brush TOP101: the last k nodes in the linked list
PanGu-Coder:函数级的代码生成模型