最新要闻
- 天天看点:侠盗猎车手圣安地列斯攻略
- 每日热议!稳了!索尼PS4/PS5之父操刀新一代PS6主机:发布时间及首发大作曝光
- 当前消息!三星Galaxy S23 Ultra又出问题:S Pen被指出现随机断连
- 数码相机卖不动:2023年1月销量大跌36%!单反惨烈
- 世界今日讯!长安深蓝全新中型SUV S7亮相:仪表盘“消失”
- 传大超转职普莱斯上尉
- 环球快播:美国一架飞机在飞行中突然强烈颠簸 竟致1人死亡
- 一口气58首歌 主办方因为周杰伦多唱被罚钱!周董回应:哥无所谓
- 环球热消息:抖店个体和企业开店费用_开店费用
- 世界关注:成都皮肤科医院排名第一_成都皮肤科医院qq
- 每日看点!硬挺不厚 穿着不热!放克纯棉T恤大促:20.1元包邮
- 售价13.99万元起 本田型格HATCHBACK正式上市
- 辣眼睛?网红“安福路小公主”首度回应质疑:给自己外貌打90分 对恶评不在意
- 超百Gbps容量!中星26号卫星成功定点:我国自研卫星平台
- 全球微动态丨防缩水可机洗 GXG男士针织衫:89元手慢无
- 201球!姆巴佩加冕队史射手王 24岁就成第一人 2.2亿投皇马?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天信息:MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
序言
闲来无聊,前段时间发现一个.net开源框架:masa framework。经过一些小型项目使用,发现确实挺不错的。然后我又去阅读了整个masa framework源码,特此来记录整个源码阅读的过程。如有错误之处还请指点
MASA Framework简介
Masa Framework是 masa stack系列中用于开发web系统的框架,它能够帮助我们技术团队在 传统三层架构、DDD领域驱动形态随意切换,以便满足我们技术团队不同时期的需求,防止因公司业务扩张而更换技术框架带来的一系列成本。
MASA Framework组成
概述
MASA Framework主要由三部分组成,分别是:BuildingBlocks(抽象层)、Contrib(BuildingBlocks的实现)、Utils(工具库)。当然官方称BuildingBlocks叫做构建块,其实我看了下源码,就是把我们日常开发需要用到的东西(例如:多租户、多语言、仓储、配置中心、基础业务等等等等)抽象了一层,抽象出一个BuildingBlocks以便我们可以随意替换掉官方的实现,从而具备更高的扩展性(PS:官方库自由度还是挺高的)。
(资料图片)
模块组成
Masa Framework主体部分主要由19个模块组成,它涵盖了我们日常开发所需的所有组件,是一个大而全的框架。主要由以下组成:
Masa Framework底层-构建工厂设计
一个实际项目中的场景
接下来让我们看下Masa Framework框架起点的设计:MasaFactory(构建工厂)(PS:构建工厂这个名字是我取得),之所以从这个工厂说起,是因为其他模块都是用的这个工厂模式。大家都知道我们日常项目中开发都会用到依赖注入,IOC容器。虽然微软官方也提供了IServiceCollection,但是面对一个接口多种实现的模式,官方只能注入IEnumerable集合,而定位某个具体的实现类就比较困难。例如:
- 场景:在物流仓储系统中,当仓储收到销售订单发货时,需要申请物流面单,不同商家店铺可能订购了不同的快递服务。A商家店铺订购了顺丰、B商家店铺订购了中通,那么我们在申请物流面单(运单号,纸质运单打印)的时候,由于每家快递的请求和返回信息不同,就会有以下这种设计:一个面单消息转换接口,多个快递商的消息转换实现。如下图所示:
对于这种多实现的问题,MASA Framework的构建工厂是怎么优雅的解决呢?
使用MASA Framework 构建工厂解决这个问题
首先第一步大家把源码当下来,源码地址:https://github.com/masastack/MASA.Framework
我们点开源码,先看Masa.BuildingBlocks.Data.Contracts
这个类库的设计
MASA Framework的构建工厂通过options配置,可以给接口的每个实现类赋予一个简短的名称,然后通过工厂类的Create方法根据传入不同的名称,来创建对应的实例。我们来看下利用masa的构建工厂设计面单请求消息的设计图:
这样我只需要传入一个简短的名称,就能创建对应的面单消息转换类,是不是比IEnumerable集合方便呢?写再多理论也不如实操一次,下面进入我们的代码环节。
demo项目示例
- demo项目地址:https://github.com/MapleWithoutWords/masa-demos
这边以上诉的物流面单申请为例子,不同的销售订单对应的商家店铺,每个商家店铺订购的物流商不同,使用masa framework构建工厂来实现不同物流商的面单申请,在使用层面无感的效果。
- 首先我们先创建一个webapi项目,然后安装
Masa.BuildingBlocks.Data.Contracts
这个包,并把上面的物流面单消息转换的类和接口创建好,如下图所示:
- 第二步,创建
BillMessageConvertFactory
工厂类,并继承自MasaFactoryBase> 类
public class BillMessageConvertFactory : MasaFactoryBase>{ protected override string DefaultServiceNotFoundMessage => "Default BillMessageConvert not found, you need to add it"; protected override string SpecifyServiceNotFoundMessage => "Please make sure you have used [{0}] BillMessageConvert, it was not found"; protected override MasaFactoryOptions> FactoryOptions => _optionsMonitor.CurrentValue; private readonly IOptionsMonitor>> _optionsMonitor; public BillMessageConvertFactory(IServiceProvider serviceProvider) : base(serviceProvider) { _optionsMonitor = serviceProvider.GetRequiredService>>>(); }}
- 添加一个
IServiceCollection
扩展类IServiceCollectionExtensions
用于注入工厂
public static class IServiceCollectionExtensions{ public static void AddBillMessageConvertServices(this IServiceCollection services) { services.AddTransient(typeof(JDBillMessageConvert)); services.AddTransient(typeof(SFBillMessageConvert)); services.AddTransient(typeof(ZTBillMessageConvert)); services.Configure>>(opt => { opt.AddService("JD", typeof(JDBillMessageConvert)) .AddService("SF", typeof(SFBillMessageConvert)) .AddService("ZT", typeof(ZTBillMessageConvert)); }); services.AddSingleton, BillMessageConvertFactory>(); } public static MasaFactoryOptions> AddService(this MasaFactoryOptions> factoryOptions, string name, Type implType) { if (factoryOptions.Options.Any(e => e.Name == name)) { return factoryOptions; } var relationOptions = new MasaRelationOptions(name, serviceProvider => { return (IBillMessageConvert)serviceProvider.GetRequiredService(implType); }); factoryOptions.Options.Add(relationOptions); return factoryOptions; }}
- 创建一个```OutboundController`` 控制器类,在构造函数中注入 IMasaFactory
对象,如下所示
[Route("api/[controller]")][ApiController]public class OutboundController : ControllerBase{ private readonly IMasaFactory _billMessageConvertFactory; public OutboundController(IMasaFactory billMessageConvertFactory) { _billMessageConvertFactory = billMessageConvertFactory; } /// /// 获取物流面单 /// /// 销售订单id /// [HttpGet] public async Task GetBillAsync(int saleOrderId = 0) { //TODO:根据订单id获取订单信息 var saleOrderInfo = new { GoodId = 1, GoodName = "星巴克咖啡豆", ShopId = 1, ShopName = "星巴克专卖店", UserId = 1, UserName = "张三", UserPhone = "18888888888", UserAddress = "新疆省克拉玛依市" }; string logisticsProviderCode = "SF"; if (saleOrderId == 1) { logisticsProviderCode = "ZT"; } else if (saleOrderId == 2) { logisticsProviderCode = "JD"; } var billMessageConvert = _billMessageConvertFactory.Create(logisticsProviderCode); var requestMessage = await billMessageConvert.ConvertRequestMessage(new BillRequestDto { GoodId = saleOrderInfo.GoodId, GoodName = saleOrderInfo.GoodName, SaleOrderId = saleOrderId, ShopId = saleOrderInfo.ShopId, ShopName = saleOrderInfo.ShopName, UserAddress = saleOrderInfo.UserAddress, UserId = saleOrderInfo.UserId, UserName = saleOrderInfo.UserName, UserPhone = saleOrderInfo.UserPhone, }); //TODO:发送http请求 string responseStr = ""; var responseMessage = await billMessageConvert.ConvertResponseMessage(responseStr); return $"Request Message:【{requestMessage}】。Response Message:【{responseMessage.BillNo}】"; }}
- 运行项目,最终的效果如下:(PS:这边模拟不同订单对应不同的物流商,然后去申请运单号为例子)
总结
在面对一个接口多实现的场景,终于不用再用IEnumerable集合去做各种筛选来实现效果,只需要增加一个工厂类就行了
最后
MASA Framework的其它模块其实都用到这个设计,我们可以替换掉官方的实现,也可以官方的实现和自己的实现在程序内共存。
比如: Service Caller
这个模块,既可以用dapr的服务调用,也可以使用http的服务调用。
-
天天信息:MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
序言闲来无聊,前段时间发现一个 net开源框架:masaframework。经过一些小型项目使用,发现确实挺不错...
来源: 天天信息:MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
环球通讯!(数据库系统概论|王珊)第九章关系查询与关系优化:习题
天天看点:侠盗猎车手圣安地列斯攻略
每日热议!稳了!索尼PS4/PS5之父操刀新一代PS6主机:发布时间及首发大作曝光
当前消息!三星Galaxy S23 Ultra又出问题:S Pen被指出现随机断连
全球短讯!Codeforces 1785 E Infinite Game 题解 (图论,自动机,dp)
数字信号处理流程
播报:P8大佬的 62条SQL优化策略,太牛X了!! 收藏起来有大用!!!
学会了Java 8 Lambda表达式,简单而实用
天天最资讯丨修复 Ubuntu 中的 “Key is stored in legacy trusted.gpg keyring” 问题
数码相机卖不动:2023年1月销量大跌36%!单反惨烈
世界今日讯!长安深蓝全新中型SUV S7亮相:仪表盘“消失”
传大超转职普莱斯上尉
环球快播:美国一架飞机在飞行中突然强烈颠簸 竟致1人死亡
一口气58首歌 主办方因为周杰伦多唱被罚钱!周董回应:哥无所谓
环球热消息:抖店个体和企业开店费用_开店费用
世界关注:成都皮肤科医院排名第一_成都皮肤科医院qq
每日看点!硬挺不厚 穿着不热!放克纯棉T恤大促:20.1元包邮
售价13.99万元起 本田型格HATCHBACK正式上市
辣眼睛?网红“安福路小公主”首度回应质疑:给自己外貌打90分 对恶评不在意
【环球播资讯】(数据库系统概论|王珊)第九章关系查询处理和关系优化-第四节:查询优化之物理优化
直播电商名词解释
超百Gbps容量!中星26号卫星成功定点:我国自研卫星平台
全球微动态丨防缩水可机洗 GXG男士针织衫:89元手慢无
Java实战(第二版)读后总结与感想
201球!姆巴佩加冕队史射手王 24岁就成第一人 2.2亿投皇马?
日系车走下神坛?本田中国2月销量大跌三成 已连跌6月
世界看点:国家老年大学正式揭牌!超40万门课程 50周岁以上可以报名
全球自动驾驶公司排名公布 特斯拉再次垫底
环球看点!大熊猫走姿神似《狂飙》高启盛 动物园回应:走路“带风”性格豪放
人脸识别还要蹲车外看摄像头?小鹏致歉:已下架第三方应用
环球观速讯丨上汽奥迪员工内购价最高优惠16万 客服:若倒卖一查到底
当前消息!谈谈 WMTS 中的 TileMatrix 与 ScaleDenominator
当前滚动:《街霸6》嘉米伸懒腰 又一次引发网友二创热潮
全球今日讯!day01-项目介绍+SSM环境搭建
快讯:送你5款免费好玩的小游戏-搜嗖工具箱
世界热文:男子微波炉加热蛋白吃饭时爆炸 家属:很后怕 幸好还没吃进嘴里
焦点观察:95后考研落榜父母上岸疑似是营销旧文:当事人已删帖清号
今日精选:《狂飙》反派戏九成是香港导演拍摄 代表作《无间道》:网友惊叹
特斯拉召回3470辆汽车:广东又现失控连撞多车冲毁店门 潮州事故争议还在
天天观速讯丨资深教师称有学校已开始裁减英语老师:有专家称不支持取消英语主科地位建议
天天实时:黑曼巴科比还在吗_黑曼巴科比
当前头条:Paper Reading: How good are query optimizers, really?
全球实时:使用ELRepo升级CentOS内核
天天热点!使用招商银行云直连服务提现
新动态:TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
焦点信息:“学雷锋” 护平安
绝了!民间大神将手机魔改成30000mAh电池:续航BT、可两周一充
【环球报资讯】可算盼到!苹果一大波春季新品要来了:黄色款iPhone 14在列
全球观热点:二叉树遍历的操作与实现
神速!Android 15全球首曝:代号“香草冰淇淋”相当甜美
正直播:感动中国2022年度人物盛典!名单揭晓:满满正能量
全球热资讯!代表谈中传硕士在火锅店当保洁:建议大学生先就业再择业
简讯:库存多到爆!今年才两个月 SSD价格就跌超3成:还会更便宜?
环球热点!男子高速公路狂飙120km/h看《狂飙》:不碰方向盘、不看正前方
小米平板6系列来了:外形、CPU配置大曝光!确认新增NFC
焦点速读:真心恐怖!南极洲深海拍到罕见冥河水母:触手约10米长
【世界热闻】无/低代码开发平台(产品)
跳过中考、高考、研考!15岁女生被西交大少年班录取:8年本硕连读
单踏板模式害死人?广东一特斯拉疑失控连撞多车冲毁店门 两人受伤现场惨
The Missing Semester - 第五讲 学习笔记
记录--在Vue3这样子写页面更快更高效
全球今日讯!打开MASA Blazor的正确姿势5:插槽
全球焦点!弯道超车成功!中国新能源汽车产销量全世界第一
每日关注!“准点下班被辞”女子申请赔偿一个月工资 公司回应:等仲裁结果
定位解析一个因脚本劫持导致webpack动态加载异常的问题
全球热文:python名称空间和作用域
天天实时:定位Dll加载异常的方法
环球热资讯!《进击的巨人》最终季完结篇开播 前篇拿下豆瓣9.7分:改编超越原作
核心部件100%国产!东风新一代商乘通用氢燃料电池产品完成
世界热文:同档网络无敌!一加Ace 2V搭载自研的游戏云专网技术
第五章 运输层
代表建议试行十二年义务教育:中考定终身太早 拒绝小学初中内卷
一男子和峨眉山猴子练搏击互殴 当事人回应:条件反射、请勿模仿
【全球新要闻】(数据库系统概论|王珊)第九章关系查询处理和关系优化-第二节:查询优化
轻松玩转Makefile | 企业项目级Makefile实例
精选! 《狂飙》“大嫂”高叶上手小米13:徕卡人像实拍样张美呆
天天时讯:3端通用!腾讯视频VIP会员年卡148元到手
当前快讯:董明珠称格力不看文凭只看能力:研究生到一线生产线非人才
济南动物园网红小黑猩猩“柒仔”去世:初步研判系突发疾病死亡
每日热议!奔驰4S店展车充新车 女子上门维权:被骗了、将走法律程序
天天快资讯丨突发!蔚来前实习生称遭同事强奸未遂 反被拒绝留用!公司:已成立调查组
“清籁”琴
环球观点:5-Nacos注册中心
灭蟑螂小窍门厨房_灭蟑螂小窍门
关于目录问题的总结-Python
天天即时看!实现js继承的几种方式以及他们的优缺点
今热点:AI修复图片画质和视频画质的方法
【热闻】数学建模(一):LP 问题
【新要闻】如何去除新家的甲醛_如何去除新家的甲醛
2023年2月随笔-难产的“学系列”
关注:乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 深入OpenAI与马斯克、微软的秘密,通过API轻松接入ChatGPT
天天热推荐:git clone的时候出现出现 fatal: unable to access 'https://github.com/...':OpenSSL
第125篇: 期约Promise基本特性
环球速递!kong和konga的安装部署
视焦点讯!腾讯云短信的使用方法
06while循环
环球热头条丨外星人AW620M无线鼠标上市:26000 DPI、140小时长续航
世界简讯:PC优化翻车!《卧龙:苍天陨落》官方道歉:将尽快推出更新补丁
环球头条:多线程全面总结