当前位置: 首页 > 编程日记 > 正文

构建插件式的应用程序框架(八)----视图服务的简单实现(ZT)

我在前一篇文章里提到,对于停靠工具栏或者是视图最好是不要将实例放到词典中,而是将工具栏或者视图的类型放到词典中,因为视图类型会经常的被重用,并且会经常被关闭或者再打开。当实例被关闭后,资源就被释放了,对于实例的管理就会比较麻烦,所以我们分为两步走。在插件被加载的时候,我们只注册类型,在应用程序运行的时候,我们通过某种途径来实例化他。
我修改的以前的例子,主要突出本次演示的功能。这次的例子实现的功能是通过插件扩展应用程序处理不同文件的能力。在原始的应用程序中,我们可以通过File菜单的Open,只能打开一种文件,就是文本文件,大家可以在例子中看到,当我们没有加载插件的情况下,在OpenFileDialog的Filter中只有“Text(*.txt)”。选择一个文本文件以后,将会出现文本文件视图。当我们加载插件以后,在点击File->Open菜单,我们观察Filter,发现会多出两种文件:“JPEG”和“BMP”,这是我们就可以打开图片文件,选中文件以后,将会出现Picture视图,并且在主菜单下边,还会出现一个工具栏,点击工具栏上的按钮,可以给图片加上水印,并且工具栏会根据PictureView的状态(Active)显示和消失。比如你打开了一个文本视图和一个图片视图,当你切换到文本视图的时候,工具栏就会消失,再切换到图片视图的时候,工具栏又会出现。
我在框架里面添加了一个IDocumentViewService的接口,用以描述服务的功能:
None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
using System.Collections.Specialized;
None.gif
None.gif
namespace PluginFramework
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public interface IDocumentViewService
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
void RegisterView(String fileType,string fileFilter,Type viewType);
InBlock.gif        
void ShowView(String fileType, String filePath);
InBlock.gif        
void RemoveRegister(String fileType);
InBlock.gif        String GetFileFilter(String fileType);
InBlock.gif        String GetFileTypeByFileFilter(String fileFilter);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        StringCollection FileTypies 
dot.gifget;}
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

     下面是这个服务的实现:
None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
using System.Collections.Specialized;
None.gif
None.gif
namespace PluginFramework
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public class DocumentViewService:IDocumentViewService
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
private Dictionary<String, Type> docViewRegister = new Dictionary<string, Type>();
InBlock.gif        
private Dictionary<String, String> fileTypeToFileFilter = new Dictionary<stringstring>();
InBlock.gif        
private Dictionary<String, String> fileFilterToFileType = new Dictionary<stringstring>();
InBlock.gif        
private IApplication application = null;
InBlock.gif
InBlock.gif        
public DocumentViewService(IApplication app)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            application 
= app;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IDocumentViewService Members#region IDocumentViewService Members
InBlock.gif
InBlock.gif        
public void RegisterView(string fileType, string fileFilter, Type viewType)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            docViewRegister[fileType] 
= viewType;
InBlock.gif            fileTypeToFileFilter[fileType] 
= fileFilter.ToUpper();
InBlock.gif            fileFilterToFileType[fileFilter.ToUpper()] 
= fileType;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void ShowView(string fileType, string filePath)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(docViewRegister.ContainsKey(fileType))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                IDocumentView docView 
= null;
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    docView 
= (IDocumentView)Activator.CreateInstance(docViewRegister[fileType]);
InBlock.gif                    docView.Application 
= application;
InBlock.gif                    docView.ShowView(filePath);
ExpandedSubBlockEnd.gif                }

InBlock.gif                
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
ExpandedSubBlockEnd.gif                }

InBlock.gif                
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public void RemoveRegister(string fileType)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            docViewRegister.Remove(fileType);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public StringCollection FileTypies
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                StringCollection sc 
= new StringCollection();
InBlock.gif                
foreach (String key in docViewRegister.Keys)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    sc.Add(key);
ExpandedSubBlockEnd.gif                }

InBlock.gif                
return sc;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IDocumentViewService Members#region IDocumentViewService Members
InBlock.gif
InBlock.gif
InBlock.gif        
public string GetFileFilter(string fileType)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            String result 
= "";
InBlock.gif            
if (fileTypeToFileFilter.ContainsKey(fileType))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                result 
= fileTypeToFileFilter[fileType];
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return result;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IDocumentViewService Members#region IDocumentViewService Members
InBlock.gif
InBlock.gif
InBlock.gif        
public string GetFileTypeByFileFilter(string fileFilter)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            String result 
= "";
InBlock.gif            
if (fileFilterToFileType.ContainsKey(fileFilter))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                result 
= fileFilterToFileType[fileFilter];
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return result;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

相关文章:

服务器怎么设置网站写入权限,如何设置服务器写入权限设置方法

如何设置服务器写入权限设置方法 内容精选换一换将用户组添加至企业项目中&#xff0c;并为其设置一定的权限策略&#xff0c;该用户组中的用户即可拥有策略定义的对该企业项目中资源的使用权限。本小节指导您如何为企业项目添加用户组并授权。分辨率低的情况下单击页面右上方的…

CSDN蒋涛提出技术社区三倍速定律,称下一个20年全球开发者数量将过亿

10 月 24 日&#xff0c;科大讯飞 1024 开发者节在合肥举行&#xff0c;中国 IT 技术社区 CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛受邀发表了主题演讲。 在演讲中&#xff0c;蒋涛提出了“技术社区三倍速定律”&#xff0c;如何理解&#xff1f; 2013 年 CSDN 上关于…

可穿戴医疗设备火爆背后的困境

目前在电商平台搜索可穿戴手表、手环等可穿戴产品&#xff0c;品牌不下百种。市场调研机构IDC发布的最新报告显示&#xff0c;今年第一季度全球可穿戴设备发货量达到1140万部&#xff0c;同比增长200%&#xff0c;连续第八个季度实现增长。但是目前的可穿戴医疗设备基本停留在外…

【华为AI十强应用·上卷】官宣!这里的AI应用“神了”……

现在大火的AI&#xff0c;从概念落地到成为人们普遍接受的现实&#xff0c;度过了将近70年的时间。而当下&#xff0c;AI正在以最切实的方式影响着人们的生活&#xff0c;无论是工作还是娱乐&#xff0c;所以眼前的2018年正是AI为主流“代言”的关键一年。别说&#xff0c;还真…

JavaScript类——鼠标点击下笑脸变化

2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>动态笑脸</title> <style> * { box-sizing: border-box; } .container { width: 400px; min-height…

VS2005字符串资源不能识别转义字符

在做LED媒体播放室多语言版本的时候&#xff0c;遇到这么一个问题&#xff0c; 检查office2003是否存在&#xff0c;如果不存在则弹出一个警告窗体。由于是多语言版本&#xff0c;所以弹出的信息来源于资源文件。 如果对提取的资源字符串不做任何处理&#xff0c;则弹出如下的对…

大掌柜商业管理系统服务器地址,大掌柜软件通用版操作说明.doc

大掌柜软件通用版操作说明PAGEPAGE 157系统应用基础内容提要&#xff1a;大掌柜软件专业版对系统的要求数据库SQL server2000的安装大掌柜软件专业版服务器端与客户端的安装加密狗的安装1.1系统运行环境系统运行环境的配置无疑是确保软件正常运行的重要条件之一&#xff0c;软件…

r语言remarkdown展示图_使用R语言包circlize可视化展示blast双序列比对结果

circlize这个包还挺强大的&#xff0c;R语言里用来画圈图还挺方便的。 今天这篇文章记录用circlize这个包画圈图展示blast双序列比对结果的代码植物线粒体基因组类的文章通常会分析细胞器基因组间基因转移情况&#xff0c;基本的分析方法就是blast比对。可视化展示可以选择用这…

吴恩达说“将引领下一波机器学习技术”的迁移学习到底好在哪?

AI技术年度盛会即将开启&#xff01;11月8-9日&#xff0c;来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。 如果你是某个AI技…

获取系统相关属性

uname -a uname -r cat /etc/issue cat /etc/redhat-release #进入centos后忘记自己安装的是6还是7&#xff0c;可以从这里查看 转载于:https://www.cnblogs.com/biaopei/p/7730684.html

双水泵轮换工作原理图_「物业管理工作」水泵维护保养规程

1 目的为规范水泵维护保养程序&#xff0c;特制定本规程。2 适用范围适用于公司管辖范围内水泵(包括生活水泵、消防水泵及集水坑潜水泵)及其相关设施的维护保养。3 职责3.1 给排水维修工负责水泵的维护保养。3.2 值班锅炉工或电梯工负责晚间协助对水泵房设备运转情况的巡查。3.…

Dropbox如何使用机器学习从数十亿图片中自动提取文字

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | Leonard Fink译者 | 刘旭坤整理 | Jane出品 | AI科技大本营【导读】提到 Dropbox&#xff0c;大家可能都知道这是一个文件同步、备份、共享的云存储软件。其实 Dropbox 可以实现的功能远不止这些。今天就为大家介绍 Dr…

001_性能压测工具

一、 Jmeter

SharePoint Server 2007 页面模型

虽然SharePoint Server 2007使用了ASP.NET 2.0的基础页面模型&#xff0c;SharePoint页面基本上也是基于标准的aspx技术来构建&#xff0c;但SharePoint Server 2007的页面模型仍然要比普通的ASP.NET应用复杂很多。对于一个SharePoint开发人员&#xff08;和设计人员&#xff0…

oracle存储过程的常用语法

记录一下&#xff0c;主要方便自己以后查找&#xff1a; createorreplaceproceduresp_test(aa invarchar,bb innumberdefault0) isv_pos varchar(50);v_num number;begin---字符串查找和替换selectSUBSTR(PARAMETER, 1, INSTR(PARAMETER,branchId)-2) ||SUBSTR(PARAMETER, INST…

机器学习大神迈克尔 · 乔丹:我讨厌将机器学习称为AI

AI技术年度盛会即将开启&#xff01;11月8-9日&#xff0c;来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。 如果你是某个AI技…

es6箭头函数(=)与展开特性运算符(...)的使用

2019独角兽企业重金招聘Python工程师标准>>> 箭头函数的几个写法 //当含有固定个参数的时候&#xff0c;es5写法 function test(a,b){ ..}//es6写法(es6参数可以设置默认值) let test (a,b) > {..}当函数体中仅有一行的时候&#xff0c;可以省略掉return与外部的…

华为atn980传输设备_在头发丝中实现每秒1000张高清DVD传输

这是近日央视《对话》栏目“超高清视频带来的产业诱惑”节目中&#xff0c;提到的随着4K、8K超高清视频发展&#xff0c;顺应时代发生的变化之一。超高清视频将为消费者带来全新的、超乎想象的体验。在这其中&#xff0c;黑科技的涌现更是对产业快速发展起着不可磨灭的推动作用…

李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程,你收集全了吗?

AI技术年度盛会即将开启&#xff01;11月8-9日&#xff0c;来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。 如果你是某个AI技…

2 拖拽模型_3Dmax插件 | 螺丝钉、挖洞、网格模型等可以分分钟搞定

今天给大家带来3Dmax插件Mesh Insert v1.14Mesh Insert是一款3dsmax建模插件&#xff0c;灵感来自Polystein for Modo。它通过替换库中模型资源快速插入到模型表面。非常适合硬表面和有机建模!1大纲1、安装说明2、插件功能3、视频讲解2过程步骤1安装说明1、关闭max&#xff0c;…

谈谈职业规划——CSDN对我的采访

职业规划就像软件工程电信、银行等行业一直是许多人非常向往的工作单位&#xff0c;清差厚禄&#xff0c;旱涝保收&#xff0c;陈皓却不以此为然。所以当记者采访他的时候&#xff0c;他连用了两个“最”字来形容他离开银行的成就感。陈皓毕业后的前两年就职于云南省工商银行&a…

最实用的机器学习算法优缺点分析,没有比这篇说得更好了

AI技术年度盛会即将开启&#xff01;11月8-9日&#xff0c;来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。 如果你是某个AI技…

南大电子机器人入驻云南_云南大学外语协会 英文歌曲演唱比赛

云南大学外语协会英文歌曲演唱比赛顺利落幕2020年11月8日14&#xff1a;30&#xff0c;云南大学外语协会英文歌曲演唱比赛在文汇楼2116顺利开展。比赛流程简洁明了&#xff1a;参赛同学完成抽签之后&#xff0c;在主持人的引导下&#xff0c;按照流程有序进入指定位置等待表演&…

Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法

1. BeanFactory BeanFactory&#xff0c;以Factory结尾&#xff0c;表示它是一个工厂类(接口)&#xff0c;用于管理Bean的一个工厂。在Spring中&#xff0c;BeanFactory是IOC容器的核心接口&#xff0c;它的职责包括&#xff1a;实例化、定位、配置应用程序中的对象及建立这些对…

智“逗”冰雪寒

和小K帮客户做完直播准备&#xff0c;他说一会儿要接冰雪寒冰&#xff0d;雪&#xff0d;寒多伟大的名字——我来51看的第一篇博客就是他的《网管日志》那曾经是51最火的文章之一<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />…

装饰模式(Decorator Pattern)

装饰模式&#xff08;Decorator Pattern&#xff09;一句话 继承一个抽象类&#xff0c;加上自己的特点&#xff0c;然后再使自己也变成抽象类&#xff0c;然后让子类继承的模式&#xff0c;叫装饰模式。意图…

python 区域和检索_304. 二维区域和检索(Python)

题目难度&#xff1a;★★★☆☆类型&#xff1a;二维数组方法&#xff1a;动态规划给定一个二维矩阵&#xff0c;计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2)。示例:给定 matrix [[3, 0, 1, 4, 2],[5, 6, 3…

观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

1 观察者模式的原理&#xff0c;首先由一个主题&#xff0c;当主题发送变化的时候&#xff0c;通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer…

专访图灵奖得主John Hopcroft:中国必须提升本科教育水平,才能在AI领域赶上美国

AI技术年度盛会即将开启&#xff01;11月8-9日&#xff0c;来自Google、Amazon、微软、Facebook、LinkedIn、阿里巴巴、百度、腾讯、美团、京东、小米、字节跳动、滴滴、商汤、旷视、思必驰、第四范式、云知声等企业的技术大咖将带来工业界AI应用的最新思维。 如果你是某个AI技…