`
yyzhpq
  • 浏览: 310883 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多
 我在前一篇文章里提到,对于停靠工具栏或者是视图最好是不要将实例放到词典中,而是将工具栏或者视图的类型放到词典中,因为视图类型会经常的被重用,并且会经常被关闭或者再打开。当实例被关闭后,资源就被释放了,对于实例的管理就会比较麻烦,所以我们分为两步走。在插件被加载的时候,我们只注册类型,在应用程序运行的时候,我们通过某种途径来实例化他。

我修改的以前的例子,主要突出本次演示的功能。这次的例子实现的功能是通过插件扩展应用程序处理不同文件的能力。在原始的应用程序中,我们可以通过File菜单的Open,只能打开一种文件,就是文本文件,大家可以在例子中看到,当我们没有加载插件的情况下,在OpenFileDialog的Filter中只有"Text(*.txt)"。选择一个文本文件以后,将会出现文本文件视图。当我们加载插件以后,在点击File->Open菜单,我们观察Filter,发现会多出两种文件:"JPEG"和"BMP",这是我们就可以打开图片文件,选中文件以后,将会出现Picture视图,并且在主菜单下边,还会出现一个工具栏,点击工具栏上的按钮,可以给图片加上水印,并且工具栏会根据PictureView的状态(Active)显示和消失。比如你打开了一个文本视图和一个图片视图,当你切换到文本视图的时候,工具栏就会消失,再切换到图片视图的时候,工具栏又会出现。

我在框架里面添加了一个IDocumentViewService的接口,用以描述服务的功能:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;

namespace PluginFramework
{
    public interface IDocumentViewService
    {
        void RegisterView(String fileType, string fileFilter, Type viewType);
        void ShowView(String fileType, String filePath);
        void RemoveRegister(String fileType);
        String GetFileFilter(String fileType);
        String GetFileTypeByFileFilter(String fileFilter);

        StringCollection FileTypies { get; }
    }
}

下面是这个服务的实现:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;

namespace PluginFramework
{
    public class DocumentViewService : IDocumentViewService
    {
        private Dictionary<String, Type> docViewRegister = new Dictionary<string, Type>();
        private Dictionary<String, String> fileTypeToFileFilter = new Dictionary<string, string>();
        private Dictionary<String, String> fileFilterToFileType = new Dictionary<string, string>();
        private IApplication application = null;

        public DocumentViewService(IApplication app)
        {
            application = app;
        }
        #region IDocumentViewService Members

        public void RegisterView(string fileType, string fileFilter, Type viewType)
        {
            docViewRegister[fileType] = viewType;
            fileTypeToFileFilter[fileType] = fileFilter.ToUpper();
            fileFilterToFileType[fileFilter.ToUpper()] = fileType;
        }

        public void ShowView(string fileType, string filePath)
        {
            if (docViewRegister.ContainsKey(fileType))
            {
                IDocumentView docView = null;
                try
                {
                    docView = (IDocumentView)Activator.CreateInstance(docViewRegister[fileType]);
                    docView.Application = application;
                    docView.ShowView(filePath);
                }
                catch
                {
                }
            }
        }

        public void RemoveRegister(string fileType)
        {
            docViewRegister.Remove(fileType);
        }

        public StringCollection FileTypies
        {
            get
            {
                StringCollection sc = new StringCollection();
                foreach (String key in docViewRegister.Keys)
                {
                    sc.Add(key);
                }
                return sc;
            }
        }

        #endregion

        #region IDocumentViewService Members


        public string GetFileFilter(string fileType)
        {
            String result = "";
            if (fileTypeToFileFilter.ContainsKey(fileType))
            {
                result = fileTypeToFileFilter[fileType];
            }
            return result;
        }

        #endregion
        #region IDocumentViewService Members


        public string GetFileTypeByFileFilter(string fileFilter)
        {
            String result = "";
            if (fileFilterToFileType.ContainsKey(fileFilter))
            {
                result = fileFilterToFileType[fileFilter];
            }
            return result;
        }

        #endregion
    }
}

时间比较紧,写的比较粗糙。另外定义了DocumentView的基本功能,就是需要打开的文件的路径,以及显示的方法。再插件了,我实现的一个PictureView,为两种文件注册了这个视图类型,大家可以根据自己的需要继续扩展。转眼又十一点多了,明天还要上班,就写到这里了,又说的不清楚的地方,大家可以参考一下源代码。

源代码
http://files.cnblogs.com/guanjinke/pluginsample8.rar
分享到:
评论

相关推荐

    插件式应用程序设计PPT

    EngineFramework是一个具体的插件式应用程序框架示例,可能由张学宝(我不是小菜)开发,应用于基于ArcGIS Engine的应用。该框架可能包含了一系列设计话题,如如何实现插件识别、加载和通信机制,以及如何利用面向...

    插件式系统框架.zip

    综上所述,"插件式系统框架.zip"文件中包含的知识点主要是利用C#、WPF和MVVM构建插件式系统的方法,以及如何通过这些技术实现插件的动态加载、管理和交互。通过学习和实践这些技术,开发者可以构建出灵活、可扩展的...

    GrailsWeb应用框架grails-core

    Grails 是一个基于 Groovy 语言的开源Web应用程序框架,它构建在Java平台上,充分利用了Java EE(企业版)的诸多特性。"grails-core"是Grails框架的核心模块,包含了构建、运行和管理Grails应用程序所需的基本组件和...

    WPF 使用Caliburn.Micro搭建MEF插件化框架

    总结来说,结合WPF、Caliburn.Micro和MEF,我们可以构建一个高度可扩展的应用程序框架,允许开发者轻松地添加、修改和删除功能模块。这种架构方式在大型企业应用或需要频繁迭代的项目中尤其有用,因为它促进了代码的...

    PHP 敏捷开发框架 CodeIgniter - 快速 Web 应用开发详解

    本手册将深入探讨CodeIgniter的核心概念、架构以及如何利用其特性构建高效的应用程序。 一、CodeIgniter简介 CodeIgniter以其MVC(模型-视图-控制器)架构为基础,提供了一个清晰的开发流程。它强调代码组织,使得...

    RCP程序中集成其他插件的配置方法

    在IT行业中,RCP(Rich Client Platform)是Eclipse框架提供的一种用于构建桌面应用程序的平台。它允许开发者基于已有的框架构建复杂、可扩展的应用,而无需从零开始编写所有基础架构。本篇文章将深入探讨如何在RCP...

    简易框架demo-简单的复现了一下可爱的youtube

    标题“简易框架demo-简单的复现了一下可爱的youtube”表明这是一个示例项目,它模仿了YouTube的一些功能,使用了一个简化的框架来实现。这个项目可能是为了教学、学习或者展示特定技术而创建的。 描述中的“简易...

    eclipse插件开发---简单例子

    一旦掌握了基础,你就可以继续探索更复杂的插件开发,如使用PDE(Plug-in Development Environment)工具集、使用RCP(Rich Client Platform)创建桌面应用程序,甚至参与Eclipse社区的开源项目。

    Pines:功能打包的Web应用程序框架。-开源

    Pines是一个开源的Web应用程序框架,它为开发者提供了构建高效、灵活且可扩展的应用程序所需的各种工具。框架的核心特性包括一个高级对象关系映射器(ORM)、广泛的方法挂钩系统、先进的包管理机制以及模型-视图-...

    原创MVC框架----Smart

    Smart MVC框架是一款开源的、基于模型-视图-控制器(MVC)设计模式的轻量级Web应用框架。该框架由开发者原创设计,旨在提供高效、灵活且易于维护的Web开发解决方案。通过解耦应用程序的业务逻辑、数据处理和用户界面...

    JavaEE框架项目-javaEE框架项目资源

    通常在JavaEE项目中,我们会看到诸如MVC(模型-视图-控制器)的设计模式,其中Spring MVC是Spring框架的一个组件,用于构建Web应用程序。而其他文件夹和模块可能涉及到数据访问层(通常使用JPA或MyBatis),服务层...

    Play Framework应用程序框架 v3.0.1.zip

    在“Play Framework应用程序框架 v3.0.1.zip”这个压缩包中,包含的是Play Framework的v3.0.1版本的相关资源。 首先,让我们深入了解Play Framework的核心特性: 1. **异步编程模型**:Play Framework使用Akka ...

    Java框架---Struts2 jar包

    Struts2是一个强大的Java web应用程序框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性高、结构清晰且易于扩展的Web应用的工具。Struts2的核心在于它能有效地分离业务逻辑、数据模型...

    Qt QGenericPlugin插件使用案例,主界面调用插件界面

    在本文中,我们将深入探讨Qt框架中的QGenericPlugin机制,以及如何在实际应用中实现主界面调用插件界面的功能。Qt是一个强大的跨平台应用程序开发框架,广泛应用于GUI设计和系统集成。QGenericPlugin是Qt提供的一种...

    Qt简易通用开发框架

    Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者可以构建美观、高效且可移植的应用程序。在本框架中,“Qt简易通用开发框架”旨在简化开发过程,提高代码复用性,并降低学习...

    WPF MvvM 使用 MEF 构建插件Demo

    Managed Extensibility Framework (MEF) 是.NET Framework的一部分,它提供了一种简单的方式来实现插件式架构。MEF允许应用程序发现、加载和组合来自不同源的外部组件,而无需直接引用这些组件。这种机制使得开发者...

    csharp插件开发

    3. **插件架构**:构建插件式的应用程序框架需要一个清晰的结构,确保插件与主应用程序之间的交互顺畅。这通常涉及定义公共接口或基类,让插件实现这些接口以提供服务,而主程序则通过这些接口与插件进行通信。 4. ...

    基于C ++ 14/17的HTTP应用程序框架drogon.rar

    *基于模板,实现了一种简单的反射机制,以完全解耦主程序框架,控制器和视图。 *支持cookie和内置会话; *支持后端渲染,控制器将数据生成到视图以生成Html页面。视图由CSP模板文件描述,C ++代码通过CSP标记嵌入到...

    用于构建web应用程序的Python微框架.zip

    本资源包“用于构建Web应用程序的Python微框架.zip”聚焦于Python中的微框架,这是一种轻量级的Web应用开发解决方案,适合小型项目或作为大型系统的一部分。 微框架的概念是为了提供一种简化、灵活且高效的开发方式...

Global site tag (gtag.js) - Google Analytics