Prism學習(5)---Hello Silverlight


之前的章節中,從對一個計算器解決方案的重構,學會了Prism應用的基礎知識。現在,我們再從一個新的Silverlight項目開始,繼續Prism的學習。

 

看來今天運氣有點背啊,我下載的Prism的版本是4.1的,它源碼中的Silverlight部分是基於 Silverlight 5.0的。可惜,我當前系統中只安裝了Silverlight 4.0 的 SDK。 郁悶中... 好不容易下載下來,一安裝又提示要求安裝 VS 2010 SP1。 要噴血了! 好吧,哥慢慢跟你耗着。

下載...安裝.... (兩個小時) .....  

-_ -! .... 算了, 我睡覺的, 明天接着搞。

 

 

 

終於搞定了!開始今天的 Hello Silverlight:

首選,新建一個名叫SLDemoApplication的Silverlight應用程序。建好之后,需要刪除掉里面的MainPage.xaml的自定義控件。

今天先讓Prism跟Silverlight打個招呼,就用引用Shell了。直接創建兩個Silverlight的應用程序: ModuleAProject, ModuleBProject, 直得注意的是,這里一定要選擇創建Silverlight應用程序。如果選擇Siverlight類庫,那么他最后生成的是dll文件。這樣的話,在稍后配置程序集清單的時候會有麻煩。

 

創建完成后,刪除這兩個程序集中的App.xaml和MainPage.xaml兩項, 之后再添加一個類庫:InterfaceProject。這里面用來記錄上面創建的兩個項目中需要實現的接口,在里面定義兩個接口: ITextService和IUIService, 分別定義兩個方法: string GetText(); UIElement GetUI()。 非常簡單的兩個接口。接着,在ModuleAProject中添加一個類,實現接口ITextService。在ModuleBProject中添加一個類,實現接口IUIService。代碼如下:

1     public class TextService:ITextService
2 {
3 public string GetText()
4 {
5 return "Hello Silverlight!";
6 }
7 }

 

    public class UIService : IUIService
    {
        ITextService textService;

        public UIService(ITextService textService)
        {
            this.textService = textService;
        }

        public UIElement GetUI()
        {
            return (new TextBox()
            {
                Text = textService.GetText(),
                VerticalAlignment = VerticalAlignment.Top,
                Width = 300
            });
        }
    }

 

非常簡單,緊接着是最重要的一個步驟:在這兩個模塊里面,分別添加一個類,實現IModule接口,並在該類中,注冊各自的類。代碼如下:

 1     public class TextServiceModule:IModule
2 {
3 IUnityContainer container;
4
5 public TextServiceModule(IUnityContainer container)
6 {
7 this.container = container;
8 }
9
10 public void Initialize()
11 {
12 container.RegisterType<ITextService, TextService>();
13 }
14 }
 1     public class UIServiceModule:IModule
2 {
3 IUnityContainer container;
4
5 public UIServiceModule(IUnityContainer container)
6 {
7 this.container = container;
8 }
9
10 public void Initialize()
11 {
12 container.RegisterType<IUIService, UIService>();
13 }
14 }


兩個模塊定義好了, 接下來的事情,就是想辦法在主程序中來調用了。在SLDemoApplication項目添加一個類,讓其實現 IModule接口:代碼如下:

 1     public class MainModule:IModule
2 {
3 IUnityContainer container;
4
5 public MainModule(IUnityContainer container)
6 {
7 this.container = container;
8 }
9
10 public void Initialize()
11 {
12 IUIService ui = container.Resolve<IUIService>();
13
14 App.Current.RootVisual = ui.GetUI();
15 }
16 }

這一個類的作用是從Prism框架中,把已經注冊好了的UIService取出來,獲取一個UI控件給 Application的RootVisual。這樣,這個控件就可以被加載到起始頁中了。為了讓上面的代碼順利執行,我們還需要做三件事:

1. 定義一個UnityBootstrapper類。 在這個自定義的類里實現從服務器加程序清單,該類需要添加到SLDemoApplication項目下。代碼如下:

 1     public class SLBootstrapper: UnityBootstrapper
2 {
3 protected override Microsoft.Practices.Prism.Modularity.IModuleCatalog CreateModuleCatalog()
4 {
5 return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml(
6 new Uri("modulecatalog.xaml", UriKind.Relative));
7 }
8
9 protected override DependencyObject CreateShell()
10 {
11 return null;
12 }
13 }

 

2. 配置程序集清單,如上面的代碼中所示,SLBootstrapper將會從服務器上的modulecatalog.xaml文件中去取回程序集清單。所以,我們需要為他創建一個同名的文件。不過,這個文件是一個xml格式的文件。本解決方案中程序集的配置信息如下(ModuleType中還非要加上版本號,不加不跟你玩... ):

 1 <?xml version="1.0" encoding="utf-8" ?> 
2 <Modularity:ModuleCatalog
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:sys="clr-namespace:System;assembly=mscorlib"
6 xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism">
7
8 <Modularity:ModuleInfo
9 Ref="ModuleAProject.xap"
10 ModuleName="TextServiceModule"
11 ModuleType="ModuleAProject.TextServiceModule, ModuleAProject, Version=1.0.0.0"/>
12
13 <Modularity:ModuleInfo
14 Ref="ModuleBProject.xap"
15 ModuleName="UIServiceModule"
16 ModuleType="ModuleBProject.UIServiceModule, ModuleBProject, Version=1.0.0.0">
17 <Modularity:ModuleInfo.DependsOn>
18 <sys:String>TextServiceModule</sys:String>
19 </Modularity:ModuleInfo.DependsOn>
20 </Modularity:ModuleInfo>
21
22 <Modularity:ModuleInfo
23 Ref="SLDemoApplication.xap"
24 ModuleName="MainModule"
25 ModuleType="SLDemoApplication.MainModule, SLDemoApplication, Version=1.0.0.0">
26 <Modularity:ModuleInfo.DependsOn>
27 <sys:String>UIServiceModule</sys:String>
28 </Modularity:ModuleInfo.DependsOn>
29 </Modularity:ModuleInfo>
30
31 </Modularity:ModuleCatalog>


3.運行啟動器。我們知道,Silverlight的程序是從App.xaml開始啟動的。啟動時,會觸發 Application_Startup 事件,默認情況下,會實例化MainPage對象,並將該對象賦給App的RootVisual屬性。這樣,MainPage就被發送到請求的客戶端了。之前,我們刪除了MainPage。 不過是否注意到了在 MainModule 類的 Initialize方法中我們也向當前的App的屬性賦了一個值:UIService創建的 UI控件。 也就是說,當我們執行SLUnityBootstrapper 的時候,就會自動將程序集中創建好的UI控件加載客戶端中。所以,就有了如下的代碼:

1         private void Application_Startup(object sender, StartupEventArgs e)
2 {
3 SLBootstrapper boot = new SLBootstrapper();
4 boot.Run();
5 }

 

好了。程序完成,測試通過。 今天先讓 Prism跟 Silverlight打個招呼。明天繼續... ... 

 

今天的源代碼點擊這里下載!






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM