Tecky‘s Blog

你拍一、我拍一,喝着茅台吹牛逼
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何拆分SilverLight应用程序以适应MEF动态加载XAP

Posted on 2011-01-28 18:32  Tecky Li  阅读(676)  评论(2编辑  收藏  举报

首先、使用MEF框架,构建动态加载主应用程序,定义首次加载的xap包名称,和xap加载顺序,定义加载中时界面显示逻辑(自定义进度窗口等等)。

自定义进度可以使用DownloadProgressChanged事件

通过DeploymentCatalog 对象可以控制当前的加载进度。

第二、定义每个功能型XAP包与主应用程序之间通信的接口文件:

    public interface IMainApplication
    {
        /// <summary>
        /// Gets or sets my interactor instance.
        /// 该接口实例提供了如何将本模块和其他的模块进行交互,以及如何主窗体进行交互
        /// </summary>
        /// <value>My interactor instance.</value>
        /// <Author>Tecky Lee</Author>
        /// <Date>2011-1-22 11:37</Date>
        IInteractor MyInteractorInstance { get; set; }
    }
那么IInteractor中是提供了那些交互方法那?
    public interface IInteractor
    {
        void BeginLoadObject(string xapName, string contractName = null);
        void BeginLoadXAP(string xapName);
        System.Windows.Controls.Panel GetMEFContainer();
        event EventHandler<ModuleLoadedEventArgs> ModuleLoaded;
    }

第三、在MainApp中应用Application级别的代码,比如处理WCF异常在SilverLight客户端中交互等等。

第四、正确拆分现有的SilverLight解决方案,使得各个SL应用程序之间不能互相引用,公用或者需要交互的类型必须保证唯一(也就是放到公用的SL类库中)

第五、在每个xap子项目中暴露需要在MainApp中发现的UserControl,这些UserControl需要实现IMainApplication接口,这样就可以与主程序进行交互了。

形如:

[Export(typeof(UserControl))]

第六、在xap子项目中通过ModuleLoaded等定义在IInteractor接口中的方法事件来自动操作主程序加载其他xap包,并控制当前SilverLight容器加载的UI控件。

第七、xap子项目中式被下载并加载时,不会执行其中的App(继承自Application)类,那么就需要在暴露的UserControl的InitialComponent之前执行App中的部分逻辑,比如合并全局资源字典、或者其他本Prj中用到的全局对象等。

第八、为了进一步减少这个xap包的大小,并实现按需加载的思路,要求所有的xap子项目都要使用xap应用程序缓存项,使xap包只包含当前项目编译产生的dll,其他引用dll都以同名zip文件形式存在。此项措施包括MainApp。

第八、部署WCF服务端和SilverLight网站客户端。

第九、连调。