重构笔记---MEF框架(下)

摘要:
概述上一篇文章介绍了MEF的一个非常简单和基本的应用程序,实现了MEF框架,并展示了MEF架构的一些基本要求和设置。这些基本知识非常重要。接下来,我们将分析如何扩展或增强MEF框架的内容。在间接引用DLL依赖于主机之后,扩展库将不会生成或复制内核。这样,插件类库将只生成自己类库的DLL,而不生成引用DLL。至少看起来很整洁。有了上述技术的铺垫,项目重建将为MEF架构的软件重建提供一条光明的道路。
概述

上一篇介绍了MEF的一个很简单很基本的应用,实现了MEF框架并展示了MEF框架的一些基本的要求和设置,这些基础知识很重要,接下来我们分析一下如何扩展或增强MEF框架内容。

增强的Contract类库

其实有了上篇的介绍,读者很快会发现,Contract类库制约性很强,或者说“它”只引用了windows自带的System.XXX类型的公共类库,而往往在协议中我们是要引用我们实际项目工程中的方法和成员,这样就导致了要依赖一个非系统的公共类库,例如Practise_MEF.Core。那能否还能实现,我的插件仅仅生成一个“类库DLL”呢?

首先我们来看一下依赖性图解:

重构笔记---MEF框架(下)第1张

这里所有项目工程都将依赖于Core,这其中Practise_MEF和Practise_MEF.contract是直接引用(Copy Local = true),Practise_MEF.Plugin.MultiCalculateEx是间接引用(Copy Local = false),这里CalculateEx这个项目没有引用Core,如果引用的话也为间接引用。扩展库通过间接引用后将不产生或复制Core.DLL,而是依赖于宿主(一般指调用扩展类库的UI类库,这里是Practise_MEF),这样插件类库只会产生本身类库的DLL而不会产生引用的DLL,至少看起来比较工整。

项目重构

有了上面这些技术上的铺垫,我们就为重构为MEF架构的软件提供了一条光明的道路。然而,道路永远是曲折的。

首先,既然框架式基于协议的,那就得分析要重构的项目中哪些是公共的属性、方法,以便提取出接口,这是至关重要的,如果没有共性,那重构本身的意义并不是很大。

在整理、提取项目核心类库的过程中,我认为一下几个方面值得提出到Core中:

  1. BaseForm
  2. 基础的Module/Entity/Objects
  3. 接口Interface
  4. 枚举Enum
  5. 委托Delegate
  6. 工具类Utility
  7. 基础方法Fucntion

。。。

其它,业务逻辑、非基础方法则提取到BLL等上层模块中。

Docker框架

在Winform下推荐WeifenLuo的DockPanel插件,这个插件实现起来简单方便、功能强大,可以将插件的Form作为Docker的一个子集加入其中,布局上类似于Visual Studio 编辑器。

介绍WeifenLuo:

http://www.cnblogs.com/wuhuacong/archive/2009/07/09/1520082.html

总结

有了以上三个方面的积累,使得重构成为MEF插件框架成为可能。

由于此项目尚在开中,故相关代码不宜公开。

免责声明:文章转载自《重构笔记---MEF框架(下)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转载--redis密码管理神经网络(8)---如何求神经网络的参数:cost function的表达下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.NET Core容器化开发系列(一)——Docker里面跑个.NET Core

前言     博客园中已经有很多如何在Docker里面运行ASP.NET Core的介绍了。本篇主要介绍一些细节,帮助初学的朋友更加深入地理解如何在Docker中运行ASP.NET Core。 安装Docker     Docker现支持在主流Linux、Windows和macOS上安装,官方的安装文档请参考docker docs。鉴于国内的网络环境,...

重构的技巧

原文:http://www.cocoachina.com/industry/20140816/9397.html 我想一条童子军的军规:“始终保持露营地比你发现它的时候还要干净”。如果你在地上发现了一点脏东西,不管是谁弄的,都清理掉它。要为了下一拨来露营的人改善环境。(实际上,那条规矩的早期版本,出自Robert Stephenson Smyth Bden...

Vue.js框架:IDEA中vue文件代码自动补全设置

一、初始效果 默认的vue文件,在IDEA中编辑起来和在记事本中没啥差别,没有颜色区分,没有自动补全。 二、设置方法 1、安装vue.js插件: (1)搜索vue.js插件进行安装: File->Settings->Plugins: 重启IDEA使其生效。 (2)配置vue文件模板: File->Settings->File T...

.Net Core 商城微服务项目系列(十三):搭建Log4net+ELK+Kafka日志框架

之前是使用NLog直接将日志发送到了ELK,本篇将会使用Docker搭建ELK和kafka,同时替换NLog为Log4net。 一.搭建kafka 1.拉取镜像 //下载zookeeper docker pull wurstmeister/zookeeper //下载kafka docker pull wurstmeister/kafka:2.11-...

搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (二)创建你的项目

本篇文章的目的:首先是创建解决方案。并创建相关的项目。先介绍一下项目的各自的作用: 从数据库层到表示层依次为: 数据库层:          1、接口IDao层:IDao          2、Dao层实现:HibernateDao和SqlDao               HibernateDao:由Hibernate实现的IDao部分         ...

ASP.NET Core开发者路线指南(转)

先决条件 C# Entity Framework ASP.NET Core SQL基础知识 通用开发技能 学习GIT, 在GitHub中创建开源项目 掌握HTTP(S)协议, 及其请求方法(GET, POST, PUT, PATCH, DELETE, OPTIONS) 不要害怕使用 Google,Google搜索技巧 学习dotnet CL...