【Prism】MEF版HelloWorld
2015-07-22 21:06
387 查看
[b]引言[/b]
Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codeplex.com/,在上面可以有最新的源码和Demo,其中多数Demo都是用Unity容器构建的,而本人比较喜欢MEF,打算把Unity的Demo全部改成MEF的,先从HelloWorld开始吧.
[b]模块HelloWorldModule[/b]
我们需要将HelloWorld.xaml先导出,,如下
然后在HelloModule中做好Region和View的映射,映射有多种方式,我这里把其中一种注释掉,如下
[b] 主程序PrismHelloWorld[/b]
在主程序中,我们需要继承MefBootstrapper,重写其中的几个方法,可以看到MEF的一个大优点,可以不引用的情况下加载模块程序集,如下
[b]部署[/b]
在主程序的启动目录下,新建Modules文件夹,将编译后的HelloWorldModule.dll丢进去,运行主程序,OK.
[b]示例源码[/b]
PrismHelloWorld.rar
[b]小结[/b]
示例比较简单,看代码即可明白,就不一一说明了.虽然是从最简单的HelloWorld改起,但是在学习Prism框架之前,必须对WPF基础,MEF容器,MVVM模式有一定了解,不然学起来一头雾水.
Pirsm框架是由微软P & P小组设计的,用于构建组合式的WPF企业级应用,支持两个IOC容器,分别为Unity和MEF.官方地址为http://compositewpf.codeplex.com/,在上面可以有最新的源码和Demo,其中多数Demo都是用Unity容器构建的,而本人比较喜欢MEF,打算把Unity的Demo全部改成MEF的,先从HelloWorld开始吧.
[b]模块HelloWorldModule[/b]
我们需要将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)); } }
[b] 主程序PrismHelloWorld[/b]
在主程序中,我们需要继承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(); } }
[b]部署[/b]
在主程序的启动目录下,新建Modules文件夹,将编译后的HelloWorldModule.dll丢进去,运行主程序,OK.
[b]示例源码[/b]
PrismHelloWorld.rar
[b]小结[/b]
示例比较简单,看代码即可明白,就不一一说明了.虽然是从最简单的HelloWorld改起,但是在学习Prism框架之前,必须对WPF基础,MEF容器,MVVM模式有一定了解,不然学起来一头雾水.
相关文章推荐
- 什么是最久未使用淘汰算法,试举出一种实现方法?
- 《以交易为生》书中指标源码
- 时间日期处理公共类
- 第七天Object类和异常
- VLC 播放RTP 所需要的SDP文件格式
- hdoj 2036 改革春风吹满地
- 【数据库】创建表以及一些基本的表操作
- [读书笔记]SQL金典
- HDOJ 2037 今年暑假不AC(贪心)
- poj 3255 次短路算法(好)
- 1056. Mice and Rice (25)
- autotools 生成的makefile 常用 目标
- KMP字符串模式匹配详解
- Windows 7下,一块硬盘突然掉盘时的windows操作系统日志
- 使用百度地图API进行坐标系转换
- 平衡的括号
- eclipse php 开发环境搭建记录
- Android入门:短信和拨打电话
- 学习的过程
- hdu 1233 还是畅通工程(kruskal求最小生成树)