最新要闻
- 天天最资讯丨暴雪又搞砸了 老外批《守望先锋2》太失败:浪费4年开发
- 桌面RTX 4070玩游戏 显示器选2K还是4K?来看对比实测 全球热推荐
- 远离元宇宙后 扎克伯格财富暴涨3000亿 全球最多!|全球新视野
- 小米两大技术接入联发科平台!卢伟冰:天玑芯片影像蜕变
- 37岁姐姐跟98年男友520领证 网友:羡慕了 天天讯息
- 全球观察:直通车是什么快递_直通车是什么
- 10.998万元 春风1250TR-G摩托价格公布:用上75°V型双缸发动机
- 焦点速看:丰田再批电动车毫无意义:烧煤发电不环保 氢燃料才合理
- 【环球时快讯】瓦伦丁·迪奥曼德_关于瓦伦丁·迪奥曼德介绍
- 天天观察:年轻人发完红包看电影 520单日总票房超1.5亿:速激10位列第一
- 网吧用“蛤蟆”、“天鹅”区分男女厕所 网友点赞直呼有才:官方回应
- 樱桃自由了!水果贵族樱桃一斤直降30元 六七月份还会继续降
- B站CEO陈睿:年轻人爱学习 超8成985、211学生是B站用户 天天速递
- 三星独占结束!国产手机将用上“鸡血版”二代骁龙8-当前视点
- 浏阳:残疾人以“武”会友,散发的是自信和快乐-全球资讯
- 马斯克回避的赛道蔚来进军了:可控核聚变20年内商用_环球热点
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日看点!Natasha 插件化之dll
调用外部dll来实现组件化
场景
- 有一个设备管理控制系统,主要作用是控制设备及收集相关设备的信息,目前只集成了门禁和监控,后期期望添加更多设备时,一般都是在公司编写完后现场实施并调试,代码一般也是每个设备创建独立的项目,供总项目调用;慢慢的可能会演变出所有设备都继承一个公共的接口类,接口类中实现获取能力集和发送命令,以此来减少对于总控模块的修改,而此时只需要维护好能力集即可;可是这样每次也需要运行一整个解决方案,如果其他地方也需要这个系统,只能通过卸载项目来减少引用进行实时,这时就可以通过将项目分拆出去,通过Natasha进行组件化的管理。这样子的好处是通过约定的接口和能力集进行通信,主程序和设备耦合度低,如果遇到其他项目需要该系统,只需要将所需的dll放入特定文件夹即可。
- 任何可以分拆成模块的系统都可以按照组件化的逻辑进行开发,例如有业务流程的项目,每个步骤可有多个组件选项,可执行一个或者多个;或者说通过获得的插件来动态配置那一步应执行那个插件,通过插件的反馈判断是否应执行下一步操作。
好处
- 低耦合,业务分拆,插件只需要关心插件接口及反馈即可,不需要关心核心系统的业务逻辑
- 分工明确,每个人只需关注插件代码即可,项目整合后出现问题也好排查,未调用插件,则主系统有问题,调用插件结果与实际不符则插件有问题。
- 维护方便,学习成本低,对于某一个特定插件,代码量会远远低于整个项目的代码量,而且每个业务都可以进行分拆。
实现
- 获得Assembly
主要使用NatashaDomain类实例化的方法(源码位置:src\Natasha.Domain\Extension\NatashaDomainExtension.cs)
(相关资料图)
相关方法:
LoadPluginUseDefaultDependency如果加载的dll已经被加载过了,则跳过
LoadPluginWithAllDependency不会判断高低版本,源码中的解释是默认的,感觉和Default类似
LoadPluginWithHighDependency使用高版本的dll
LoadPluginWithLowDependency 使用低版本的dll
参数说明:
string path必填,dll所在路径
Func
? excludeAssembliesFunc = null选填,需要排除的dll,返回true为排除引用,例如共同引用某个公用的dll(例如Utils.dll),此时可以选择使用哪个版本的dll
- 找到clas类并且实例化
找到class类(默认所有插件的实现类为*Controller),也可以按照下面例子来
var type = assembly.GetTypes().Where(item => item.Name.IndexOf("Controller")!=-1).First();
实例化
var plugin = (IPluginClass)(Activator.CreateInstance(type)!);
例子
创建两个底层项目
IPluginBase项目:用于创建插件使用的接口
using PluginUtil;namespace IPluginBase{ public interface IPluginClass { ///
/// 初始化方法 /// public void initialize(); ////// 获得插件特有的方法 /// ///public List getFunction(); /// /// 获得需要定时方法 /// ///public List getTimeFunc(); /// /// 通过方法执行插件代码 /// /// FruitFunction /// 可能输入的数值 ///public String execute(FruitFunction function, String param); }} PluginUtil项目,用于声明FruitFunction
using System.ComponentModel;namespace PluginUtil{ public enum FruitFunction { [Description("硬度")] hardness = 01, [Description("苹果特有功能")] appleAttr = 02, [Description("切")] cut = 03 }}
创建两个插件项目
PluginApple项目
using IPluginBase;using PluginUtil;namespace PluginApple{ public class PluginAppleClass : IPluginClass { public string execute(FruitFunction function, string param) { switch (function) { case FruitFunction.cut: Console.WriteLine("切苹果"); break; case FruitFunction.hardness: Console.WriteLine("苹果很脆"); break; case FruitFunction.appleAttr: Console.WriteLine("苹果特有属性"); break; } return "结束"; } public List
getFunction() { Console.WriteLine("返回苹果的现有功能"); return new List () { FruitFunction.appleAttr, FruitFunction.cut, FruitFunction.hardness }; } public List getTimeFunc() { Console.WriteLine("返回苹果的定时功能"); return new List () { FruitFunction.cut}; } public void initialize() { Console.WriteLine("苹果初始化完成"); } }} PluginBanana项目
using IPluginBase;using PluginUtil;namespace PluginBanana{ public class PluginBananaClass : IPluginClass { public string execute(FruitFunction function, string param) { switch (function) { case FruitFunction.cut: Console.WriteLine("切香蕉"); break; case FruitFunction.hardness: Console.WriteLine("香蕉很软"); break; } return "结束"; } public List
getFunction() { Console.WriteLine("返回香蕉的现有功能"); return new List () { FruitFunction.cut, FruitFunction.hardness }; } public List getTimeFunc() { Console.WriteLine("返回香蕉的定时功能"); return new List () { FruitFunction.cut }; } public void initialize() { Console.WriteLine("香蕉初始化完成"); } }}
使用Natasha实现两个插件项目的方法
前置条件:将PluginApple.dll和PluginBanana.dll放到NatashaStudyConsole.exe同级下的plugins文件夹中
using IPluginBase;using PluginUtil;using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace NatashaStudyConsole{ internal class PluginDemo { public void PluginMethod() { //获得dll存放路径 string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory+ "plugins"); //实例化NatashaDomain NatashaDomain domain = new(Guid.NewGuid().ToString()); List
assemblies = new List (); //通过获得所有的dll来进行实例化 Directory.GetFiles(path, "*.dll").ToList().ForEach(dll => { //加载dll var assembly = domain.LoadPluginWithAllDependency(dll); // 本例子中项目名称为"A",需要实例化的类为"AClass",因此使用IndexOf方法 // 获得项目名称 var asmName = assembly.GetName().Name!; // 根据项目名称判断应该实例那个class var type = assembly.GetTypes().Where(item => item.Name.IndexOf(asmName)!=-1).First(); // 实例化 var plugin = (IPluginClass)(Activator.CreateInstance(type)!); if (plugin != null) { // 保存 assemblies.Add(plugin); } }); assemblies.ForEach(assembly => { // 实现相关方法 List functions = assembly.getFunction(); if(functions != null && functions.Count > 0) { assembly.execute(functions[0], ""); } }); } }} 代码结构示意图:
执行结果:
关键词:
每日看点!Natasha 插件化之dll
天天最资讯丨暴雪又搞砸了 老外批《守望先锋2》太失败:浪费4年开发
桌面RTX 4070玩游戏 显示器选2K还是4K?来看对比实测 全球热推荐
远离元宇宙后 扎克伯格财富暴涨3000亿 全球最多!|全球新视野
小米两大技术接入联发科平台!卢伟冰:天玑芯片影像蜕变
37岁姐姐跟98年男友520领证 网友:羡慕了 天天讯息
全球观察:直通车是什么快递_直通车是什么
虎书 第一章 图形流水线_环球焦点
10.998万元 春风1250TR-G摩托价格公布:用上75°V型双缸发动机
焦点速看:丰田再批电动车毫无意义:烧煤发电不环保 氢燃料才合理
【环球时快讯】瓦伦丁·迪奥曼德_关于瓦伦丁·迪奥曼德介绍
C++ Today01
Kafka未触发消费异常排查实录-全球实时
基于python实现-根据Excel表格指定的UniqueKey的顺序-到另一个参考表格中查找-补全与自己相关的数据
Revit二次开发实战
天天观察:年轻人发完红包看电影 520单日总票房超1.5亿:速激10位列第一
网吧用“蛤蟆”、“天鹅”区分男女厕所 网友点赞直呼有才:官方回应
樱桃自由了!水果贵族樱桃一斤直降30元 六七月份还会继续降
B站CEO陈睿:年轻人爱学习 超8成985、211学生是B站用户 天天速递
三星独占结束!国产手机将用上“鸡血版”二代骁龙8-当前视点
浏阳:残疾人以“武”会友,散发的是自信和快乐-全球资讯
OPEN AI角色插件通道开放接入支持各种细分领域对话场角色景模型一键接入AI 智能 聚焦
记录--Vue中如何导出excel表格
马斯克回避的赛道蔚来进军了:可控核聚变20年内商用_环球热点
首发联发科8200-Ultra!小米Civi 3跑分出炉|全球即时
新疆乌鲁木齐达坂城姑娘特色农产品展示中心预计7月投用|当前速讯
网约车拒违停 2乘客赖车上超24小时还原地撒尿 官方通报:行拘-新要闻
告别MMO手游氪金!《逆水寒》手游公测预告片发布:6月30日见
黄百鸣谈为何拍《叶问5》:前几部成绩好 甄子丹也想拍 天天报道
李荣浩沉迷《王国之泪》 吐槽吉波得女王太难:不可能有人打的过 世界速递
环球快看:Revit二次开发 知识点总结(表格)
环球今亮点!荣耀:再见了,高价低配!骁龙8+芯片+IMX800仅2599元
老车主退10万差价业界良心!极狐阿尔法S HI先行版上市:32.98万_世界观速讯
微信开放520元红包:特别的爱也可以是最多1000元 世界简讯
当前要闻:synopsys dw_axi_dmac 使用集成经验
直播源码技术控制直播稳定之消息篇
全新一代华为海思芯片V811首发!七大绝技 支持8K30Hz解码-每日简讯
明道回应与蒋雯丽拍戏争议 姐弟恋新剧《转角之恋》口碑翻车:网友直呼辣眼|当前关注
焦点消息!安徽大别山区和沿江江南部分地区将有大雨到暴雨
当前简讯:4K分辨率搭配全玻璃镜头!当贝F6投影仪发布:新一代海思V811芯片 支持8K解码
网易1.5折甩卖暴雪“分手遗产” 有人狂抢4箱转卖:暴雪国服仍没人接_当前热点
拉脱维亚第20届“汉语桥”中文比赛落下帷幕
组件化编程
速看:使用ln命令在Linux系统中创建连接文件
当前观点:400元档性能天花板!当贝盒子H3S发布:8K HDR、3+32GB存储
华为等怎么看?报告称5G网放缓 运营商赔本减少投入:4G更成熟 最新快讯
浦城县气象台发布雷电黄色预警信号【2023-05-20】
《变形金刚:超能勇士崛起》宣布,说唱歌手GAI周延为说唱盟友
AMD、NV开打价格战!RX 7600售价曝光:或跟RTX 4060同价甚至更低
当前视点!究竟是噱头还是体验升级?18GB大内存手机实测体验
今天520:微信已开放520元大红包 限时一天 新消息
吸塑是什么材质(吸塑是什么材质)
5/19组讯 | 古装虐恋剧《婉婉如梦霄》、电影《高危漏洞》先导片、院线电影《心鼓》等
清除ExecutionContext,阻止 AsyncLocal 在异步流、Thread中传递
焦点快播:vulnhub靶场搭建
每日速看!剧版《1818黄金眼》开机!网友:谁演紫金陈
华为Mate X3为何能做到极致轻薄还可靠?张朝阳物理课揭秘真相|天天关注
买新三级能效空调的人为什么多了?原因揭开_当前视点
新动态:电池放两周就报废!电车真就这么娇贵?真的
电脑微信占用100多GB空间 解决办法来了:重回清爽流畅
世人谓我恋长安其实只恋长安某_红衣佳人白衣友 朝与同歌暮与酒 世人谓我恋长安 其实只恋长安某|环球观焦点
黑枸杞食用方法视频 黑枸杞食用方法|消息
欧洲奇树的皮长到15厘米厚 被吉尼斯列为世界上最大与最古老纪念碑
报告称有100多万建筑的纽约正在下沉 自由女神像将半淹没在海水中
《王者荣耀》520皮肤正式开卖 亚瑟-追逃游戏皮肤首周价格为1430点券
端午节三天假期后将连上6天班 多数网友计划出行
福建省发现整窝恐龙蛋及零星恐龙蛋壳碎片 为长形蛋类
环球关注:华利集团接待高毅资产等多家机构调研
《漫长的季节》荣登近5年来评分最高电视剧 导演称看到分数后落泪
北京将遭雷雨大风沙尘轮番袭击 伴有短时强降水和冰雹等
日本北海道一老人在野外湖边钓鱼 被棕熊残忍吃掉
数据显示87%的打工人第一份工作月薪不超过一万 更注重个人发展
雅万高铁实现全线接触网送电 为高铁列车运行提供动能
文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题-全球速看
SLAM建图导航信息(仿真)
苹果混合现实设备下月发!光成本就过万了 苹果贴本卖-全球聚焦
每日速递:微软690亿美元收购暴雪又一个障碍扫除 魔兽国服重开有望了?
当前速读:乔迪:浙江队下半场展现风格追平比分 我们还是要找回自信
资讯推荐:3天假期后需连上6天班 端午节出行预定开始了:机票酒店搜索大增
医学生喷《后浪》剧情喷上热搜 官微回应称请拭目以待
每日观察!创远信科接待开源证券股份有限公司等多家机构调研
平板App适配稳了!OPPO、小米等联合通知:App开发者应适配大屏
通用汽车在美召回约66.8万辆汽车 因一部件“涂粉”厚了 环球速看料
蔚来汽车进军可控核聚变 20年内能把聚变商业化?|全球今热点
特斯拉的“营销预算”还真不少 只是没算到账上
10核i7+32GB+双2.5G网口 雷神mini主机到手2999_世界热闻
History(历史)命令用法15例-天天关注
当日快讯:离岸人民币短线拉升涨超100点
天天消息!送走马斯克等于利好?全球最大广告买家摘掉推特“风险”帽
SSD刚想涨价 主控一哥慧荣泼下凉水:最高降价50%去库存
视讯!消息称格力解散手机核心团队 或不再出手机新品:官网已打不开
当前快播:喜大普奔 iPhone可以同步Windows11了
焦点速讯:私家车辆坠河情况紧急!众人义无反顾跳河救人:大赞
iOS视频播放常用重点知识_资讯
国网江苏超高压公司研发应用二次电缆识别仪
中金普洛斯REIT扩募获基金份额持有人大会表决通过 首批REITs扩募再进一步
海外网友热议JDG击败T1:Faker打的太烂 该退役了|全球新资讯
天天看热讯:夏天别急着开空调!这几项准备工作别忘了
全球报道:在美国没有未来!自动驾驶卡车独角兽大裁员:重心将回归国内
RTX 4080与RTX 4090同跑《赛博朋克2077》差距有多大?