WCF开发框架之插件化应用模式升级
自从在《Winform开发框架之插件化应用框架实现》一文中,介绍并总结了Winform开发框架插件化应用框架的实现后,赢得了很多同行和客户的支持,于是把我的WCF开发框架、混合式开发框架都进行了升级,把它们都提升到插件化应用的高度上。本文主要介绍WCF开发框架,如何实现插件化的应用。从我随笔《基于我的Winform开发框架扩展而成的WCF开发框架》介绍可以看到,一般的WCF应用,是在客户端添加服务应用的方式,然后使用自动生成的WCF服务客户端代理来访问相应的服务的,这种方式比较方便快捷,但是也增加了客户端界面和WCF服务的耦合性,架构布局如下所示。

为了更好有效利用松耦合的特点,以及插件化应用的特点,我对整个WCF开发框架进行了一个大的调整,以便更好整合及利用好的特点。如下图所示,插件化应用框架的启动模块,它除了依赖基础服务模块中(包括权限管理模块和字典模块),其他的模块如WCF服务模块、主业务插件模块A(主业务模块B)等都是通过配置方式实现对接的,他们之间没有明显的耦合关系。

整个项目工程的布局如下所示,其中BaseUIDx为基础界面类,方便各个插件模块重用而分离出来的。其他模块的功能如上图所示。

主业务插件模块是指各种各种的插件化业务模块,他们本身包含有界面部分、WCF服务调用、以及业务逻辑等内容。

为了更好分离WCF服务的部署和WCF服务逻辑(这也是最佳实践),实现更好的代码控制和重用,WCF项目的架构关系设置成如下所示。

其中WHC.WareHouseMis.WCFLibrary是整个WCF服务的业务逻辑模块,它囊括了统一调用接口Facade层、WCF业务实现WCFLibrary层、BLL业务层、数据接口IDAL层、数据访问实现DAL层、实体类Entity层。

当然,以上的关系不需要手工来做这些繁琐的代码对应关系,只需要设计好表后,使用代码生成工具Database2Sharp一键生成就可以了,其中很多项目关系已经生成好了,增量开发的时候,重新引用下文件关系即可。
而且整个WCF不在使用在界面层直接引用WCF服务的方式,而采用了自定义的客户端信道(允许从自定义的配置文件中加载)方式实现对应WCF服务客户端代理类的创建。
以WCF的调用类ItemDetailCaller为例,使用代码生成工具生成的代码,它已经继承了某个接口IItemDetailService服务基类了,并给它指定了具体的WCF服务节点即可,如下代码所示。
public class ItemDetailCaller : BaseService<ItemDetailInfo>, IItemDetailService
{
public ItemDetailCaller() : base()
{
this.endpointConfigurationName = EndPointConfig.ItemDetailService;
}
实现接口IItemDetailService的函数很有规律,使用下面类似的代码即可。
public List<ItemDetailInfo> FindByBigType(string bigType)
{
List<ItemDetailInfo> result = new List<ItemDetailInfo>(); IItemDetailService service = CreateSubClient();
ICommunicationObject comm = service as ICommunicationObject;
comm.Using(client =>
{
result = service.FindByBigType(bigType);
}); return result;
}
这样进行了包装后,我们使用WCF服务就好像之前的Winform开发框架使用BLLFactory的方式一样了,WCF服务调用示例代码如下所示。
bool succeed = CallerFactory<IItemDetailService>.Instance.Update(info, info.ID.ToString());
if (succeed)
{
try
{
StockInfo stockInfo = CallerFactory<IStockService>.Instance.FindByItemNo2(this.txtItemNo.Text, this.txtBelongWareHouse.Tag.ToString());
if (stockInfo != null)
{
stockInfo.WareHouse = txtBelongWareHouse.Text;
CallerFactory<IStockService>.Instance.Update(stockInfo, stockInfo.ID.ToString());
} //不管是更新还是新增,如果对应的备件编码在库房没有初始化,初始化之
bool isInit = CallerFactory<IStockService>.Instance.CheckIsInitedWareHouse(this.txtBelongWareHouse.Text, this.txtItemNo.Text);
if (!isInit)
{
CallerFactory<IStockService>.Instance.InitStockQuantity(info, , this.txtBelongWareHouse.Text);
}
}
catch (Exception ex)
{
MessageDxUtil.ShowTips(string.Format("初始化库存为0失败:", ex.Message));
} return true;
}
WCF开发框架之插件化应用模式升级的更多相关文章
- Winform开发框架之插件化应用框架实现
支持插件化应用的开发框架能给程序带来无穷的生命力,也是目前很多系统.程序追求的重要方向之一,插件化的模块,在遵循一定的接口标准的基础上,可以实现快速集成,也就是所谓的热插拔操作,可以无限对已经开发好系 ...
- fusionjs uber开源的通用web插件化开发框架
fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ...
- Android 插件化 动态升级
最新内容请见原文:Android 插件化 动态升级 不少朋友私信以及 Android开源交流几个 QQ 群 中都问到这个问题,这里简单介绍下 1.作用 大多数朋友开始接触这个问题是因为 App 爆棚了 ...
- 在WPF中使用Caliburn.Micro搭建MEF插件化开发框架
原文:在WPF中使用Caliburn.Micro搭建MEF插件化开发框架 版权声明:原创内容转载必须注明出处,否则追究相关责任. https://blog.csdn.net/qq_36663276/a ...
- Apache DolphinScheduler 2.0.1 来了,备受期待的一键升级、插件化终于实现
✎ 编 者 按:好消息!Apache DolphinScheduler 2.0.1 版本正式发布! 本版本中,DolphinScheduler 经历了一场微内核+插件化的架构改进,70% 的代码被重构 ...
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- 罗列几个Android插件化开发框架
携程插件化框架 ACDD插件化框架 360插件化框架 Android-Plugin-Framework DL APK动态加载框架 部分框架对比 DynamicLoadApk 迁移成本很重:需要使用『t ...
- RN学习1——前奏,app插件化和热更新的探索
react_native_banner-min.png React Native(以下简称RN)有大量前端开发者的追捧.前端开发是一个活跃的社区,一直尝试着一统前后端,做一个全栈开发,RN就是他们在客 ...
- iOS 插件化开发汇总 Small框架
应用插件化背景 目前很多应用功能越来越多,软件显得越来越臃肿.因此插件化就成了很多软件发展的必经之路,比如支付宝这种平台级别的软件: 页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小 ...
随机推荐
- Codeforces Round #382 (Div. 2) A. Ostap and Grasshopper bfs
A. Ostap and Grasshopper 题面 On the way to Rio de Janeiro Ostap kills time playing with a grasshopper ...
- redmine v3.02版的安装问题
redmine v3.0.2版的安装问题 参考上次在朋友公司的云主机上安装的过程: 1. 下载 2. gem install bundler 3. bundle install 出现 rmagick ...
- Android开发(二十九)——layout_weight的含义
首先声明只有在Linearlayout中,该属性才有效.之所以android:layout_weight会引起争议,是因为在设置该属性的同时,设置android:layout_width为wrap_c ...
- mac上parallel与virtualbox无法共存
Mac reboots when you attempt to launch Parallels Desktop 8 and Virtual Box simultaneously Article ID ...
- java利用透明的图片轮廓抠图
需要处理的图片: 1.png(空白区域为透明) 2.png 处理后的结果图片:result.png 代码如下: import java.awt.Graphics2D; import java.awt. ...
- Swing How to make dialogues
There are two types of dialog: modal non-modal: must use JDialog directly Taken JFileChooser as Exam ...
- [emacs org-mode小技巧] org-indent-mode 让文档更容易阅读
刚发现Emacs的org-mode里面一个叫做 org-indent-mode 的minor mode对于阅读org-mode文档很不错,版面看起来清晰多了: 从上图可以看到,org-indent-m ...
- CKEditor4.1和CKFinder2.3.1 for Mvc4最新 破解版,结合 打造"帅"的编辑器 For .Net
CKEditor4.1+CKFinder2.3.1 FOR MVC4 最新破解版:(2013-3-23) baidu share: http://pan.baidu.com/share/link?sh ...
- 在 Visual Studio 中打开编辑 cshtml 文件时出现错误:未能完成该操作 无效指针 的解决方法
第一步:关闭 Visual Studio: 第二步:删除 %LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache 下的所有文件: ...
- 使用hexo在github上写blog
使用hexo在github上写blog 安装nodejs http://nodejs.org/ 安装hexo npm install -g hexo 创建bolg文件夹 安装完成后在自己的工作目录创建 ...