【Prism】MEF版HelloWorld

引言

Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codeplex.com/,在上面可以有最新的源码和Demo,其中多数Demo都是用Unity容器构建的,而本人比较喜欢MEF,打算把Unity的Demo全部改成MEF的,先从HelloWorld开始吧.

模块HelloWorldModule

我们需要将HelloWorld.xaml先导出,,如下

[Export("HelloWorld")]
    public partial class HelloWorld : UserControl
    {
        public HelloWorld()
        {
            InitializeComponent();
        }
    }

然后在HelloModule中做好Region和View的映射,映射有多种方式,我这里把其中一种注释掉,如下

[Export("HelloModule", typeof(IModule))]
    public class HelloModule:IModule
    {
        private readonly CompositionContainer Container { get; set; }
        private readonly IRegionManager RegionManager { get; set; }
        private readonly IRegionViewRegistry RegionViewRegistry { get; set; }

        [ImportingConstructor]
        public HelloModule(CompositionContainer container, IRegionManager regionManager, IRegionViewRegistry registry)
        {
            Container = container;
            RegionManager = regionManager;
            RegionViewRegistry = registry;
        }

        public void Initialize()
        {
            HelloWorld HelloWorld = Container.GetExportedValue<HelloWorld>("HelloWorld");

            IRegion mainRegion = RegionManager.Regions["MainRegion"];
            mainRegion.Add(HelloWorld, "HelloWorld");

          //  RegionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(HelloWorld));

        }
    }

 主程序PrismHelloWorld

在主程序中,我们需要继承MefBootstrapper,重写其中的几个方法,可以看到MEF的一个大优点,可以不引用的情况下加载模块程序集,如下

  public class HelloWorldBootstrapper : MefBootstrapper
    {

        protected override void ConfigureAggregateCatalog()
        {
           //加载当前程序集
          this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(HelloWorldBootstrapper).Assembly));

          //加载模块目录中的DLL
          DirectoryCatalog directoryCatalog = new DirectoryCatalog("Modules");
          this.AggregateCatalog.Catalogs.Add(directoryCatalog);
        }

        protected override CompositionContainer CreateContainer()
        {
            CompositionContainer container = base.CreateContainer();
            container.ComposeExportedValue(container); //这里将容器导出
            return container;
        }

        protected override DependencyObject CreateShell()
        {
            return this.Container.GetExportedValue<Shell>();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();
            Application.Current.MainWindow = (Shell)this.Shell;
            Application.Current.MainWindow.Show();
        }

        protected override void InitializeModules()
        {
            //导出并初始化HelloModule
            IModule moduleB = Container.GetExportedValue<IModule>("HelloModule");
            moduleB.Initialize();
        }
    }

部署
     在主程序的启动目录下,新建Modules文件夹,将编译后的HelloWorldModule.dll丢进去,运行主程序,OK.

示例源码

PrismHelloWorld.rar

小结

示例比较简单,看代码即可明白,就不一一说明了.虽然是从最简单的HelloWorld改起,但是在学习Prism框架之前,必须对WPF基础,MEF容器,MVVM模式有一定了解,不然学起来一头雾水.

时间: 2024-10-09 19:51:54

【Prism】MEF版HelloWorld的相关文章

Prism&amp;MEF构建开发框架 (一)

Shell框架XECA shell.xaml主要起到是一个容器或壳的作用 <Window x:Class="XECA.Shell"      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                xmlns:in

Java Web框架-----------------------struts2(官网教程版HelloWorld)

Java Web框架------------------struts2(官网教程版HelloWorld) 我们都知道Struts是Java Web 常用的三大框架之一,另外还有Spring.Hibernate.学习Struts很有必 要!那么怎么学习呢?我的建议是: 1.对于英语能力还可以的人,学技术我们要从官网文档学起,再结合中文别人所写的论文.博客,视频 等.这样可以达到事半功倍的效果. 2.对于阅读英语稍微吃力的人,我们可以下载有道词典,再来本计算机专业英语书,不懂就查,但是, 我们决不能

【Prism】MEF版Commanding

引言 接下来的是Commanding Demo的改造. DelegateCommand    WPF本身提供了一个RoutedCommand,然而没什么卵用.在Prism框架中提供了个更人性化的ICommand的实现--DelegateCommand,如下 public class ArticleViewModel : NotificationObject { private readonly ICommand showArticleListCommand; public ArticleView

【Prism】MEF版UIComposition

引言 UIComposition原版Demo在PrismV5的解压包里面.原Demo用了.net4.5版本的DLL,我改成.net4.0的. RegionContext 这个Demo比之前那几个示例大概也只是多了一个新概念,那就是RegionContext. 众所周知,View的DataContext一般都是对应ViewModel,而Region很多时候也可以看成是一个View,所以Prism给了它一个RegionContext作为Region中多个子View的共享数据上下文. 一般用于Regi

【Prism】MEF版EventAggregation

引言 第三弹是EventAggregation Demo的改造. EventAggregation  EventAggregation事件聚集是Prism框架中的通信实现.它可以在松散的模块或者窗体之间引发事件和传递参数,从而达到通信的目的.用法简单,完成三部曲即可. 1.继承CompositePresentationEvent<TPayload>,自定义事件类,如下 public class FundAddedEvent : CompositePresentationEvent<Fun

Prism&amp;MEF构建开发框架 (三)

菜单管控模块EntityFW 菜单的加载采用MEF技术,程序实现思路: 1 .主菜单加载页面MainMenuView.xaml指向MenuRegion 2. 菜单Item点击及内容加载,采用订阅模式,即菜单item点击时发布消息,shell负责订阅并过滤加载子模块 MainMenuView.xaml <UserControl x:Class="EntityFW.Views.MainMenuView"       xmlns="http://schemas.microso

Qt版helloworld

跟学别的编程语言一样,Qt也不例外,一开始就想写一个helloworld.初学Qt十几天,看了一点关于Qt视频的介绍和书上的基础知识,对于Qt写工程的概念有了初步的认识,就代码的形式来说,Qt Creator可以让用户选择新建一个Gui项目和空的Qt项目.Gui项目从代码的形式上来看就跟C/C++多文件编译时差不多,分为一个类声明的.h文件.类函数实现的.cpp文件和主函数的.cpp文件,而且编译器根据我们创建项目时的选择和对于类名的命名给出了一些基本的代码框架.空的QT项目打开后就只有一个工程

Kotlin版HelloWorld

5/18 Google发布Kotlin将最为Android编写的第一级代码,据说这个语言挺强大的,咱也尝试下.首先需要对AS 版本3.0以下的进行配置下,点击 配置好之后,重新启动AS,再次打开之后,你会发现 这就代表Kotlin插件安装成功,然后建立工程后,Java代码是可以转换为kotlin代码的, 这就可以变为kotlin代码了, 转换之后就是这样了.tv_first是布局里的id 之前查找控件时候,需要好多findViewByid去查找,现在可以直接用,确实太方便了,其实这是因为我们带入

Spring.DM版HelloWorld

本文主要描述使用Spring.DM2.0,创建OSGi的HelloWorld演示程序,理解Spring.DM的OSGi框架实现机制. 环境描述: 项目 版本 Eclipse 3.7.x JDK 1.6.x Sprng.DM spring-osgi-2.0.0.M1-with-dependencies 下载地址 一.环境准备 将spring-osgi-2.0.0.M1-with-dependencies ,解压到一个文件夹中,你能看到以下目录: 在Eclipse中点击菜单:File->Import