在信息系统开发平台OpenExpressApp - 发布for .Net4版本中介绍过现在从以前的compositewpf改为.Net4自带的MEF来作为扩展应用机制,MEF的主要架构可以通过之前写的.Net4下的MEF(Managed Extensibility Framework) 架构简介来简单了解一下,对于compositewpf不了解的可以去参考它的官方网站。本篇我将介绍一下OpenExpressApp升级到for .Net4版本时如何从从compositewpf更改到MEF,想了解MEF的简单应用的也可以看看。

compositewpf的应用

  compositewpf在OpenExpressApp for .Net3的应用主要有模块装载以及界面组合两个应用,下面分别介绍一下这两方面之前如何实现的,后面会介绍这两部分如何在MEF下实现。

模块加载

  • 在【OpenExpressApp.Host.WPF】项目的【Bootstrapper.cs】单元中通过重载GetModuleCatalog来获取模块目录
protected override IModuleCatalog GetModuleCatalog()
{
ModuleCatalog catalog = new ModuleCatalog();
//制定装载OpenExpressApp模块
catalog.AddModule(typeof(ExpressAppModule));

//从目录装载
Directory.CreateDirectory(@".\Module");
var dirCatalog = new DirectoryModuleCatalog() { ModulePath = @".\Module" };
dirCatalog.Initialize();
foreach (var module in dirCatalog.Modules)
{
catalog.AddModule(module);
}
//等业务模块加载完毕在加载OpenExpressApp.Module.WPF模块。否则提前创建的DefaultOpen模块没有按钮。
catalog.AddModule(typeof(WPFModule));
return catalog;
}

  • 具体模块从IModule继承下来,并实现Initialize方法
public abstract class XXXModule :  Microsoft.Practices.Composite.Modularity.IModule
{
#region IModule Members
  public virtual void Initialize()
{ ......
}


UI组合

  • 【OpenExpressApp.Host.WPF】中的【DockableContentRegionAdapter.cs】和【DockableRegionAdapter.cs】增加两个Region适配器
  • 在Shell.xaml中注册Region:
<AvalonDock:DockingManager x:Name="_dockingManager" >
<AvalonDock:ResizingPanel>
<AvalonDock:DockablePane AvalonDock:ResizingPanel.ResizeWidth="228">
<AvalonDock:DockableContent cal:RegionManager.RegionName="Tools" Title="模块列表"/>
</AvalonDock:DockablePane>
<AvalonDock:ResizingPanel Orientation="Vertical">
<AvalonDock:DocumentPane cal:RegionManager.RegionName="Workspace"/>
<AvalonDock:DockablePane cal:RegionManager.RegionName="Pads"/>
</AvalonDock:ResizingPanel>
</AvalonDock:ResizingPanel>
</AvalonDock:DockingManager>


  • 在【OpenExpressApp.Module.WPF】项目的【WPFModule.cs】单元的初始化函数中增加控件到相应的Region
 this._regionManager.RegisterViewWithRegion(ShellRegionNames.Tools, typeof(ModuleListPad));
  • 在【Application.cs】中的打开模块中把生成的模块显示在指定工作区域
public static object OpenModule(Type boType)
{
var regions = GetRegions();
IRegion moduleRegion = regions[ShellRegionNames.Tools];
IRegion mainRegion = regions[ShellRegionNames.Workspace];
var modulePad = moduleRegion.ActiveViews.First() as ModuleListPad;
BusinessObjectInfo selectItem = GetModule(boType, modulePad);
Debug.Assert(selectItem != null, "未找到这个模块,不能打开!");
//左边的控件
modulePad.lbModule.SelectedItem = selectItem;

//右边的控件
object view = CreateView(mainRegion, selectItem);

//日志
AuditLogService.LogAsync(new AuditLogItem()
{
Title = "打开模块:" + selectItem.Label,
ModuleName = selectItem.Label,
Type = AuditLogType.OpenModule
});

return view;
}
        private static object CreateView(IRegion mainRegion, BusinessObjectInfo selectItem)
        {
            object view = null;

//如果已经打开则激活模块,否则新增模块窗体
            if (OpenModules.TryGetValue(selectItem.BOType, out view) == false)
            {
                if (selectItem.ModuleUIType != null)
                {
                    view = Activator.CreateInstance(selectItem.ModuleUIType);
                }
                else
                {
                    view = CreateModuleForm(selectItem);
                }

mainRegion.Add(view); //添加到区域

OpenModules.Add(selectItem.BOType, view);
            }

mainRegion.Activate(view);

return view;
        }

MEF的应用

  1. 从compositewpf转移到MEF,首先去除以前项目对Microsoft.Practices.XXX等项目的引用,加入对【System.ComponentModel.Composition】的引用来试用MEF
  2. 由于不用UI组合功能,删除【DockableContentRegionAdapter.cs】、【DockableRegionAdapter.cs】、【Bootstrapper.cs】
  3. 修改【App.xaml.cs】,不了解MEF基础的可以去网上搜索一下资料来学习一下
     private bool Compose()
    {
    var catalog = new AggregateCatalog();
    //添加模块程序集目录
      catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
    catalog.Catalogs.Add(new AssemblyCatalog(
    Assembly.GetAssembly(typeof(OpenExpressApp.Module.ExpressAppModule))));
    catalog.Catalogs.Add(new AssemblyCatalog(
    Assembly.GetAssembly(typeof(OpenExpressApp.Module.WPF.SystemModule.WPFModule))));
    if (Directory.Exists(@".\Module")) catalog.Catalogs.Add(new DirectoryCatalog(@".\Module"));
    _container = new CompositionContainer(catalog);
    _container.ComposeExportedValue<CompositionContainer>(_container);
    //执行模块的初始化,注意:这里的IModule接口是在OpenExpressApp.Library中实现的
    var modules = _container.GetExportedValues<IModule>();
    foreach (var module in modules)
    {
    module.Initialize();
    }

    CompositionBatch batch = new CompositionBatch();
    batch.AddPart(this);
    _container.Compose(batch);

    return true;
    }

    在App()中启动

      if (Compose())
    {
    //Application.Current.Run(_container.GetExportedValue<Window>("OpenExpressApp.MainWindow"));
    _container.GetExportedValue<Window>("OpenExpressApp.MainWindow").Show();
    }
  4. 删除【Shell.xaml】中的Region设定,在【Shell.xaml.cs】中Export一些需要扩展的UI
    [Export(ContractName.MainWindow, typeof(Window))]
    public partial class Shell : Window, IPartImportsSatisfiedNotification
    {

    [Export(ContractName.Pads, typeof(ItemsControl))]
    public ItemsControl Pads
    {
    get
    {
    return Pads;
    }
    }

    [Export(ContractName.Workspace, typeof(IWorkspace))]
    private DocumentPaneWorkSpace _Workspace
    {
    get
    {
    return new DocumentPaneWorkSpace(workspace);
    }
    }

  5. 在【Shell.xaml.cs】中Import工具面板
    public partial class Shell : Window, IPartImportsSatisfiedNotification
    {
    [ImportMany(ContractName.Tools)]
    public IEnumerable<Control> Tools { get; set; }

    public void OnImportsSatisfied() //实现IPartImportsSatisfiedNotification,组合完毕后执行
    {
    foreach (var item in Tools)
    this.tools.Items.Add(new DockableContent() { Content = item });
    }

  6. 打开模块
    在【WPFModule】中Import组合容器CompositionContainer并赋值给OpenApplication.CompositionContainer

    [Export(typeof(IModule))]
    public class WPFModule : AdaptCommandModule
    {
    [Import]
    private CompositionContainer _compositionContainer = null;

    /// <summary>
    /// 把ModuleListPad.xaml加入到region中。
    ///
    /// 加入ComboDataGrid.xaml到Resource中
    /// </summary>
    public override void Initialize()
    {
    base.Initialize();

    OpenApplication.CompositionContainer = _compositionContainer;

    在【OpenExpressApp.Module.WPF】的【Application.cs】中的【OpenApplication】类增加区域属性

    public static IWorkspace Workspace
    {
    get
    {
    return CompositionContainer.GetExportedValue<IWorkspace>(ContractName.Workspace);
    }
    }

    public static Control ModuleListPad
    {
    get
    {
    return CompositionContainer.GetExportedValue<Control>(ContractName.ModuleListPad);
    }
    }

    public static ItemsControl Pads
    {
    get
    {
    return CompositionContainer.GetExportedValue<ItemsControl>(ContractName.Pads);
    }
    }

    public static Selector ModuleListBox
    {
    get
    {
    return CompositionContainer.GetExportedValue<Selector>(ContractName.ModuleListBox);
    }
    }

  以上是迁移的主要修改部分,具体细节请大家去下载代码 信息系统开发平台OpenExpressApp - 发布for .Net4版本

更多内容: 开源信息系统开发平台之OpenExpressApp框架.pdf

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

[Export(ContractName.MainWindow, typeof(Window))]
    public partial class Shell : Window, IPartImportsSatisfiedNotification
    {

转载于:https://www.cnblogs.com/zhoujg/archive/2010/05/27/1745308.html

信息系统开发平台OpenExpressApp - 从compositewpf到MEF相关推荐

  1. 信息系统开发平台OpenExpressApp - 数据权限

    功能权限一般放在一般是放在MVC的controller层,在<信息系统开发平台OpenExpressApp - 功能权限>介绍了OEA基本的功能权限,我们是通过统一配置的.作为数据应用产品 ...

  2. 信息系统开发平台OpenExpressApp - 功能权限

    在<信息系统开发平台OpenExpressApp - 用户权限模块设计>中对RBAC以及在OEA中的涉及进行了简要介绍,上篇<信息系统开发平台OpenExpressApp - 用户管 ...

  3. 信息系统开发平台OpenExpressApp - 应用模型ApplicationModel

    下图为OpenExpressApp的系统架构图,其中在应用模型是作为一种元数据贯穿于整个架构,应用模型运行在OpenExpressApp框架之上.应用模型是OEA的核心,理解好应用模型才能更好的使用O ...

  4. 信息系统开发平台OpenExpressApp -如何部署OEA应用

    BloodyAngel 把智能部署写的比较清楚了<信息系统开发平台OpenExpressApp - ClickOnce智能部署>,我在这里再进行一些补充. 如果用过OpenExpressA ...

  5. 信息系统开发平台OpenExpressApp - 支持日志功能

    一般信息系统都有审计功能,现在给OpenExpressApp增加简单的日志功能,主要就是记录用户的一些操作(如登录.打开模块.查看数据.点击按钮等)或者系统操作时的一些信息收集(比如保存错误等).为了 ...

  6. 信息系统开发平台OpenExpressApp - ClickOnce智能部署

    这里讲的是OpenExpressApp的部署方案.主要使用的是ClickOnce作为实施方案来实现:智能部署和智能客户端.不过,这里的使用方式跟以往的不太一样-- 部署概述 OpenExpressAp ...

  7. 信息系统开发平台OpenExpressApp:【OpenTest】 之 如何实现自动化测试框架

    本文更新版本已挪至   http://www.zhoujingen.cn/blog/4549.html ------------------------------- 在OpenExprssApp的R ...

  8. 信息系统开发平台OpenExpressApp:【OpenTest】 之 语法及其使用介绍

    在OpenTest 之 运行环境准备中介绍了运行自动化测试需要做的一些准备工作,本篇将继续给大家介绍OpenTest的脚本语法以及使用方法,通过学习后读者应该能够开始动手编写UI自动化测试脚本了. 关 ...

  9. 开源信息系统开发平台之OpenExpressApp框架 1.1 春节飞虎版发布

    自 信息系统开发平台openexpressapp 1.0发布后到现在有4个月了,中间陆续发布了一些内容介绍的blog. OpenExpressApp不会带给大家创新性的技术,而是以务实的态度,将现有技 ...

  10. OpenExpressApp架构-信息系统开发平台

    本文已挪至   http://www.zhoujingen.cn/blog/1458.html 软件=商业+架构+过程+组织,前一阵子谈论的Scrum更多包含的是过程和组织,这篇主要关注的是架构. 作 ...

最新文章

  1. navicat for mysql 显示中文乱码解决办法
  2. Elixir Ecto: 范围数据类型
  3. 典型微型计算机控制系统的实例,微型计算机控制系统概述.ppt
  4. 二级C选择知识点(部分)
  5. leetcode184. 部门工资最高的员工(SQL) 连接+嵌套查询
  6. 修改linux远程主机名命令hostname
  7. java异常分类三大类_JAVA 中异常的分类
  8. 集群的可扩展性及其分布式体系结构(2)-下
  9. python基础网易_看看你的Python基础怎么样?
  10. golden gate 加initial load 在rac 上的配置
  11. 单片机c语言曲普两只蝴蝶,51单片机蜂鸣器播放音乐代码(生日快乐 两只蝴蝶 祝你平安)...
  12. C++使用技巧(二十一):makefile编写
  13. 计算机管理的服务打不开,Windows 系统服务无法打开解决方法+操作命令详解
  14. pr2打印机java 编程
  15. mmdetection3D---(1)
  16. Internet的点火人:马克.安德森
  17. Python学习笔记(基础知识第三篇:列表、元组、字典、集合)
  18. c语言程序0到1000的素数,C语言实现之100-1000以内素数的等差数列
  19. 转载-文件资源管理器无响应的解决办法
  20. html document自动加载,document.html

热门文章

  1. Cobbler详解(二)——Cobbler安装配置
  2. 协同过滤推荐算法的用户向量相似度计算
  3. Vue中computed,methods,watch用法上的异同
  4. 基本文件管理,针对Centos7的XFS文件系统备份恢复(需要更改)
  5. FastSocket学习笔记~再说客户端与服务端的组成
  6. Python测试Kafka集群(pykafka)
  7. SQL Server分页3种方案比拼[转]
  8. testlink配置修改
  9. android 学习随笔二十三(动画:Fragment )
  10. [转]网络性能评估工具Iperf详解(可测丢包率)