【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.
示例源码
小结
示例比较简单,看代码即可明白,就不一一说明了.虽然是从最简单的HelloWorld改起,但是在学习Prism框架之前,必须对WPF基础,MEF容器,MVVM模式有一定了解,不然学起来一头雾水.
【Prism】MEF版HelloWorld的更多相关文章
- Prism&MEF构建开发框架 (一)
		
Shell框架XECA shell.xaml主要起到是一个容器或壳的作用 <Window x:Class="XECA.Shell" xmlns="http ...
 - 【Prism】MEF版UIComposition
		
引言 UIComposition原版Demo在PrismV5的解压包里面.原Demo用了.net4.5版本的DLL,我改成.net4.0的. RegionContext 这个Demo比之前那几个示例大 ...
 - 【Prism】MEF版EventAggregation
		
引言 第三弹是EventAggregation Demo的改造. EventAggregation EventAggregation事件聚集是Prism框架中的通信实现.它可以在松散的模块或者窗体之 ...
 - 【Prism】MEF版Commanding
		
引言 接下来的是Commanding Demo的改造. DelegateCommand WPF本身提供了一个RoutedCommand,然而没什么卵用.在Prism框架中提供了个更人性化的ICo ...
 - Delphi_01_控制台版HelloWorld
		
对于Windows下的控制台编程,我相信很多人都不陌生.而C语言开始的著名的“Hello world”程序基本是学习编程的第一步.我想对于 RAD开发,大家熟悉的一般都是GUI编程,而对于consol ...
 - Prism&MEF构建开发框架 (三)
		
菜单管控模块EntityFW 菜单的加载采用MEF技术,程序实现思路: 1 .主菜单加载页面MainMenuView.xaml指向MenuRegion 2. 菜单Item点击及内容加载,采用订阅模式, ...
 - 初学tornado之MVC版helloworld
		
作者:the5fire | 标签: MVC tornado | 发布:2012-08-06 2:41 p.m. 文接上篇,看我一个简单的helloworld,虽然觉得这个框架着实精小,但是实际开发 ...
 - 一步步实现 Prism + MEF(一)--- 搭建框架
		
第一步:构建一个名为Bootstrapper的类作为引导程序. class Bootstrapper : MefBootstrapper { } 第二步:在MainWindow窗体中添加一个Coont ...
 - Qt版helloworld
		
跟学别的编程语言一样,Qt也不例外,一开始就想写一个helloworld.初学Qt十几天,看了一点关于Qt视频的介绍和书上的基础知识,对于Qt写工程的概念有了初步的认识,就代码的形式来说,Qt Cre ...
 
随机推荐
- 转载:http://blog.csdn.net/foruok/article/details/53500801
			
凭兴趣求职80%会失败,为什么 标签: 求职跳槽找工作兴趣技术 2016-12-07 06:51 43316人阅读 评论(69) 收藏 举报 本文章已收录于: 分类: 随笔(144) 作者同类文章 ...
 - 使用Kotlin开发Android应用(II):创建新工程
			
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
 - MAXIMUM SUBSEQUENCE SUM PROBLEM
			
排除不合理的项(负值), 设定一个标杆sum, 往后扫描看是否有比sum好的情况. We should ensure the following conditions: 1. The result m ...
 - AJAX的应用
			
用AJAX实现数据显示与删除事件 主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
 - Loadrunder脚本篇——web_submit_data实现提交post请求
			
概述 web_link()和web_url()函数都是页面访问型函数,实现HTTP请求中的GET方法,如果需要实现POST方法,可使用web_submit_form或web_submit_data() ...
 - $python正则表达式系列(5)——零宽断言
			
本文主要总结了python正则零宽断言(zero-length-assertion)的一些常用用法. 1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面 ...
 - java屏幕截取
			
CaptureScreen.java ```import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; i ...
 - python补充知识点
			
1. 在python2中用xrange,在python3中直接使用range就好了 2. 常数 None在逻辑判断的时候指代False,其他方式不代表True或者False 3. for循环只作用域容 ...
 - 斯坦福机器学习视频笔记 Week9 异常检测和高斯混合模型 Anomaly Detection
			
异常检测,广泛用于欺诈检测(例如“此信用卡被盗?”). 给定大量的数据点,我们有时可能想要找出哪些与平均值有显着差异. 例如,在制造中,我们可能想要检测缺陷或异常. 我们展示了如何使用高斯分布来建模数 ...
 - centOS最小化安装后网络连接问题
			
编辑配置文件 vi /etc/sysconfig/network-script/ifcfg-eth0 修改此行重启后即可 ONBOOT="yes" #修改为 ...