首先、使用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网站客户端。
第九、连调。