2012年3月30日

Windows Azure 申請3個月免費試用!

2012/06/02更新 台灣區已經正式開始營運,所以請大家參考這篇,這篇就給小弟留作紀念吧XD

Ruddy老師說過,使用Windows Azure,要拿老闆的卡,但是老闆死都不交出他的卡,所以幾番抉擇後,還是拿出自己的卡QQ…

申請Windows Azure的部分,小朱前輩這裡有超級詳細的攻略說明,小弟這裡就記錄紀錄自己的敗家過程,如果想知道超詳細的申請流程,可以參考小朱前輩的文章=w=。

備註:目前申請帳號需要用到手機驗證,而且只會傳到當地的手機號碼,如果沒有透過手機驗證,會無法繼續進行,而且亂Key電話號碼,會被鎖帳號!!台灣區據說5月會開放,有興趣的人也可以考慮等一下。

首先,當然是到微軟的Azure官方網站https://www.windowsazure.com/zh-tw/,目前的介面是滿漂亮的XDD,我們可以從"定價"的選單裡面看到"免費試用",但是有一點要注意一下,目前Azure的免費試用申請,還是必須要有信用卡,而且需要當地的電話號碼!!

image

點下立即體驗後,會需要Windows Live的帳號!!。

image

接下來,會有三個步驟來處理,我們這邊選擇香港特別行政區,因為目前台灣還沒有,據說2012年五月,台灣服務就會開跑了!!,這個地區,目前小弟申請完後,是沒辦法從系統自己改,也不確定是否可以透過技術客服改,所以還是建議,台灣有後,再去開通。

image

這邊是最難搞的,因為需要當地的電話號碼才能進行驗證;而且如果亂Key電話號碼,會被鎖帳號,也就是說,無論Key甚麼電話,都會告訴你電話錯誤。( 這是預防,有人惡意亂發簡訊 ),當你不小心被鎖定,就只能跨國求援了!!,至於小弟為什麼知道!?,因為這次申請,找了一堆朋友,借了朋友的瑞士、香港、日本、美國的手機做測試,但最後,因為測試過頭,就被鎖住了…,所以如果要借友人的手機,請友人收到簡訊後,馬上回覆開通碼開通,不然會和小弟一樣慘,因為他有傳送簡訊的次數!!最後小弟是問了台灣微軟,又撥香港微軟,最後轉到美國微軟…

image

最後填入資料,填入完後,微軟會刷一塊錢( 應該是一美元 ),來核對信用卡號,這要也要特別注意,未來如果更改資料,都會刷一塊錢來核對信用卡,小弟整整改了四次,改到信用卡公司都打電話過來給我,以為出了甚麼問題 = =。

image

然後就完成了!!

後記

老實說,為這次的Windows Azure,吃了超多苦頭,從一開始申請前,考慮要不要砸錢,到真的確定要申請了,然後卡在電話那關,直到後面申請成功,真的有淚奔的感覺。

也十分感謝這段時間被我騷擾的朋友們,一個一個被我追問有沒有認識國外的朋友XDD,還不斷受到MSN等等,類似詐騙簡訊的攻擊 ( 現在朋友都稱我為詐騙集團頭子了XDD ),而不幸有國外的朋友的朋友們,也很感謝你們的協助 ( 雖然我知道是因為小弟向背後靈一樣,含著怨念盯著=W= ),而願意相信小弟不是詐騙集團,敢給電話號碼的國外朋友們,小弟也是衷心的感謝妳們的信任,雖然那時候已經被鎖帳號了;此外,還要感謝被鎖帳號期間,提供不同意見,並且幫忙測試的朋友,還有台灣微軟的技術支援部門的同仁和Azure推廣的前輩、香港技術支援的同仁、美國Azure Team的同仁,努力的幫我轉信給能解決我問題的微軟大家;和這幾天被我纏著翻譯香港話、英文書信的好友們,總之,這整整一個禮拜,非常謝謝你們大家!!,也非常抱歉,造成眾多人的困擾QQ。( 套一句我朋友說的話,光這個事件,你就紅了..,總之~真的很對不起各位QQ )。

P.S 為了不影響幫忙的朋友被騷擾,這裡就不公布幫忙朋友的名字了~

最後,補充一下,這次對國外微軟的心得。

  1. 香港微軟,打電話過去後,選單只有廣東話和英文,但想辦法按進去,有人接聽後,是可以找到人說普通話的。
  2. 美國微軟,如果有勇氣打電話進去,根據這次的E-Mail往來,美國微軟那邊的技術支援顧問說,如果有需要,撥打電話進去後,他們可以提供口譯。
  3. 小弟這次是個很不好的示範,請大家不要和小弟一樣。

最後,還是要說一聲,非常感謝各位,並且也非常對不起各位>"< ( 懺悔中 ).

2012年3月29日

Entity Framework - 使用Code First模式

2013/05/30 更新,目前最新的文章在這邊。此版本為4.1版本。

印象沒記錯的話,其實在EntityFramework 4.1的時候,Code First模式就已經出來了,但是使用後,覺得卡卡的,再加上一些問題( 下一篇會提到 ),所以也沒有真正的好好研究使用,而最近,因為ASP.NET MVC 4的關係,也改良了一些東西,所以就邊看原文,邊翻譯,邊把它紀錄下來吧,此內容和原文有一點點的差異,有興趣的也可以直接看原文

小弟在開ASP.NET MVC 4專案的時候,發現預設還是4.1,如果發現還是4.1,可以使用NuGet取得最新版本。

image

What’s Code First

不知道大家是怎樣開始專案的呢?我相信,最常聽到的應該是,看使用者的需求,然後來規劃資料庫,畫出ER圖,然後就開始努力地下去Coding了( 這裡就不討論怎樣軟體開發流程是好是壞了。 )。

接下來呢!?早期小弟在寫ASP的時候,會在裡面加上一堆SQL、邏輯、畫面,組合成義大利麵式的程式碼!( 可惜實際上不夠美味 ),後來使用ASP.NET的時候,也差不了多少,一樣在.cs的檔案裏面放上一堆SQL,只是那時候用Dataset,感覺上比較高級了,後來懂得把Table變成一個又一個的物件,至少有拆開了=w=,到現在,會使用Repository Patten來拆開資料存取層,也會利用EntityFramework來進行ORM,至少有進步了XDD。

但是無論怎樣的設計上,還是會先考慮資料庫模型,想好Table的關聯,畫好ER圖,建好DB後,在開始寫程式。

而這樣的作法,也不是說好或不好,畢竟,沒有不好的方法,只有用錯的地方=w=,但今天,EntityFramework帶來另外一種作法,也就是Code First。( 如果先建立DB,就稱為DB First,如果利用EF工具,先建立好模型,就稱為Model First。)

廢話了一堆,Code First,簡單的說,就是不先建立db,也不用EF的工具建立模型,而是直接利用建立好的類別產生DB!

有沒有很酷!,老實說我覺得酷斃了,因為這樣,我就可以專心思考OO的架構,而不會分心於DB的設計上,但實際上總是現實的,因為在公司上,還有公司的DB之神,DBA在管理資料庫…

但不管怎樣,這個還是個好物,所以歷經許久後,小弟就在這邊稍微Demo一下吧!

建立Code First Demo

首先,我們就不大材小用了,這麼小小的範例,當然使用主控台應用程式就可以了!

image

接下來,我們要在專案上,按下滑鼠右鍵,選擇NuGet,來取得最新版本的EntityFramework。

image

然後,假設我們要寫一個客戶的管理程式,那自然,就要先建立一個客戶的Class,我們新增一個Class,取名為ClientBasic。

image

接下來呢!?當然就是開始打ClientBasic的程式碼啦!,那db呢!?,別忘了我們現在是Code First,顧名思義,就是先打Code!!

我們建立一個ClientBasicId,代表唯一的編號,和一個Name,就這麼簡單。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MigrationsCodeDemo
{
    public class ClientBasic
    {
        public int ClientBasicId { get; set; }
        public string Name { get; set; }
    }
}

然後,我們要建立另外一個程式碼,這個程式碼主要繼承於DbContext,簡單的說,就像是個資料庫一般,裡面會有一個屬性ClientBasics,就像是Table。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace MigrationsCodeDemo
{
    public class ClientBasicContext : DbContext
    {
        public DbSet<clientbasic> ClientBasics { get; set; }
    }
}

接下來,我們只要修改Program.cs,程式開始運作時,我們會先建立一個ClientBasicContext物件( 稱為db ),裡面會有許多方法,用來處理所有和資料庫有關的行為,然後我們在db.ClientBasics這個屬性( 可以想成ClientBasics Table ),加上一個物件( 可以想像成,加上一筆資料),而裡面有屬性Name( 可以想像成欄位Name ),值為Sky,最後利用SaveChanges方法,就會將資料寫回到資料庫。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MigrationsCodeDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var db = new ClientBasicContext())
            {
                db.ClientBasics.Add(new ClientBasic { Name = "Sky" });
                db.SaveChanges();
            }
        }
    }
}

然後,就開始跑程式,沒錯!!黑黑一片!!因為我們本來就沒有輸出甚麼,當然黑黑一片。

image

但我們去看資料庫,就會發現,他自動地幫我們建立了資料庫和Table!!,神奇吧!!就如前面所說的,我們可以完全不用考慮db該如何建,而會專心思考物件要怎麼寫,但實際上,小弟還沒有案子真正的這樣試過就是了= =..

image

如果去查資料,可以查到一筆

image

後記

就如前面流程,小弟我完全沒添加任何設定,甚至連App.Config都沒有改,預設似乎會自動去抓本機的資料庫,有需要改資料庫的人,還是可以去調整一下App.Config。

小弟這個範例,就是很簡單的先去建立類別,然後資料庫就自動幫忙建立起來了,但是聰明的你應該已經注意到了,那如果Class的屬性增加後,資料庫會不會自動變更!?答案已經很清楚了,在4.1他會丟出例外給你看XDD,所以必須先刪除掉資料庫,才能重新Run一次,也因此,下篇就會解紹真正的重點,如何處理這種問題!

參考資料

2012年3月27日

回報產品網頁問題給Microsoft

今天發現了一個Windows Azure註冊網頁上的Bug,因為是Azure,台灣也還沒正式服務,又是非產品上的問題,找了半天找不到如何通知微軟,後來經過朋友指點,利用下面的途徑回報看看,為了怕未來又忘記,所以就在這邊稍微紀錄一下,雖然說,我不覺得小弟有那麼好的運氣,可以一直找到Bug.= =..

這次是利用技術支援服務的地方去回報。

image

然後點選解決方案中心。

image

因為小弟要回報的是Windows Azure,所以在快速搜尋產品工具的地方,輸入Azure。

image

接下來,選擇協助式支援選項,然後選擇Windows Azure;這邊可以回報影響其他客戶但未在服務儀表板中反映的線上網站的問題;不過這句話實際的含意是在說明Windows Azure的服務所產生的問題。

image

接下來,就是一連串的流程了,這邊選擇想要問的主題。

image

這裡選擇需要支援的選項。

image

在這邊詳細描述問題。

image

選擇嚴重性。

image

提供聯絡資訊。

image

然後就等待回應了,這次真是個很奇妙的體驗=W=。

2012年3月23日

Windows 8 Consumer Preview 設定其他預設的瀏覽器

延續上一篇的主題,上一篇提到,Merto Style底下的IE不見了!經過設定後,雖然Metro Sytle的瀏覽器出現了,但是原本被我設定成預設瀏覽器的Firefox,又變回成IE,而因為Win 8目前也還太新,所以雖然目前IE是預設的瀏覽器,但Firefox裡面的"立即檢查"瀏覽器的功能,是檢查不出來的,也就是說,沒辦法透過Firefox來將預設的瀏覽器改為Firefox,如下圖,現在預設明明是IE,但Firefox偵測不出來。

image

當然,IE 10已經比以前的IE 6 ~ 9,強化了非常多,也支援了HTML5的功能,但礙於現在所有書籤和設定等等都在Firefox,而且工作時程也很緊迫,沒辦法讓我慢慢地去調整IE 10,所以暫時還是繼續使用Firefox吧,那要怎樣設定呢,首先,我們先利用Search功能,Search在右邊的bar裡面,如果是滑鼠可以移到右下角,就會出現,其中第一個圖示就是Search。

接下來,我們在Search打上Defa…..就可以在左邊找到Default Programs ( 小弟使用的是英文版 ),並且點開。

image

接下來,選擇Set your Default Programs

image

然後選擇了Firefox,並選擇下面的Set this programs as default,就完工了。

image

但是,這樣子Merto Style的IE,又會消失了XD;不過就如小弟說的,目前Win 8也還沒正式發佈,所以小弟我暫時不去探究如何處理這樣的問題了,未來如果正式版還有類似的問題,再來看看怎樣處理吧;總之,這樣子,就又可以恢復使用Firefox當預設的瀏覽器了。

參考網址

2012年3月22日

Windows 8 Consumer Preview Metro Style IE 不見了!

今天很開心的和同事報告前幾天去微軟參加Win 8 App的研討會,並且很得意的和同事展示Win 8特殊的地方,當介紹到Metro Style和Desktop的應用程式,其實是不同的時候,露出得意的笑容打開Metro Style IE的時候,卻出現以下畫面…這時,同事疑惑的問我,這不是和Desktop模式下一樣嗎!我也一臉疑惑的回答,我也不知道…

image

其實原本應該是要出現這個畫面的。

image

後來查到一些網站,上面有提到,不小心刪除IE 10找回來的方法,我心想,是不是不小心按到移除,所以打發走同事後,並開始照著網頁的方法來找回原本的IE…結果看到圖,覺得不太對。

image

設定完後,也還是同樣的問題。

image

後來猜想,可能是因為預設瀏覽器不是IE的關係,於是找到下資料,發現,需要做一些設定,打開Internet Options,也就是IE的設定畫面,然後進入Programs,按下Set Associations如下。

image

接下來,勾選Selece All,就完成了。

 

image

這部分感覺上是因為小弟安裝Firefox所造成XD,當Firefox變成預設瀏覽器造成的影響,而如果改回IE為預設瀏覽器,雖然Merto可以正常使用IE了,但是Desktop預設也會變成IE,畢竟目前WIN 8也並非正式版本,也不能怪罪說是誰對誰錯,未來正式版本,也可能會不同的解決方案,所以也懶得進去細部調整了,但這篇還是稍微紀錄一下,給有遇到類似問題的人=W=。

2012年3月19日

Prism - 體會Shell和Module

這篇的內容,主要是翻譯於這個網站的內容,是由國外的Nick Polyak高手所寫的,然後再加上小弟雜多的解釋內容XDD,所以內容不是百分百和原網站一樣,也請各位多多包涵 ( 所以這篇可以算是讀後心得了,不算翻譯文了.. )

最簡單!有xaml的Prism程式

上一篇,示範了完全沒有xmal的程式,利用完全沒有xaml的程式來專注於Bootstrapper上;而這篇,會示範一個最簡單,有xaml、Shell、Module的Prism程式,如果沒看過前篇,建議看一下會比較好,因為有很多的細節( 例如:Module專案怎麼建、要參考那些dll,有些不要copy local)的設定,不會再這一篇出現了。

什麼叫做最簡單呢!?運作出來的結果如下,我們可以看到畫面非常的單純( 和上一篇比,至少有字了 ),只有兩串字,最上面是整個Shell,而中間紅色的字,則是利用Prism嵌入進來的Module1。

image

Shell

Shell在Prism裡面,就像一個重劃區土地一樣,負責提供最底層的地;而地裡面會再區分一個又一個的Region,每個Region上面就可以把Module蓋上去,就像是蓋個新光、大遠百之類的建築物。

Shell和Module的XAML

開始前,我們會先把放置Shell的Main Project和放置Module的Module Project準備好;當建立這兩個專案後,預設每個專案一定都會有一個MainPage.xaml,而這邊,我們分別把這兩個專案的MainPage.xaml改名,Main Project的部分,當然是改成Shell.xaml嚕,而Module的部分,就改成Module1View.xaml ( 再次提醒,如果沒看過前篇的人,建議看一下,因為有很多的細節需要處理。 );而下面是先列出Shell和Module的XAML,以下是Shell的部分,我們可以看到,其實沒有多大的變化,只是我們多增加了prism的namespace,並且在ContentControl裡面,定義了MyRegion1的Region Name。

<UserControl x:Class="PrismDemo2HaveVisual.Shell"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:prism="http://www.codeplex.com/prism">

    <Grid x:Name="LayoutRoot" Background="White">
        <TextBlock Text="這裡是Shell,不是Module"
                   FontSize="25"
                   Foreground="Blue"
                   HorizontalAlignment="Center"
                   VerticalAlignment="Top"/>
        <!-- 放置Region,並給個名子-->
        <ContentControl HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        prism:RegionManager.RegionName="MyRegion1"/>
    </Grid>
</UserControl>

接下來是Module的XAML,這部分就很簡單,裡面只放入一個TextBlock,其他沒甚麼改變。

<UserControl x:Class="Module1.Module1View"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

    <TextBlock Text="我是Module1"
               FontSize="25"
               Foreground="Red" 
               />
</UserControl>

接下來,我們來看看程式碼的部分。

Shell和Module的程式碼

Shell.cs的部分也很簡單,我們只要在Shell Class上面加上Export這個屬性,讓MEF知道要利用這個做輸出。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel.Composition;

namespace PrismDemo2HaveVisual
{
    [Export]
    public partial class Shell : UserControl
    {
        public Shell()
        {
            InitializeComponent();
        }
    }
}

接下來,我們看看Module的部分,這部分也只需要加上Export屬性。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel.Composition;

namespace Module1
{
    [Export(typeof(Module1View))]
    public partial class Module1View : UserControl
    {
        public Module1View()
        {
            InitializeComponent();
        }
    }
}

就這樣,就完成了視覺的部分。

建立Bootstapper Class

這個部份我相信大家應該都很有經驗了,大家可以直接看看下面的程式碼,比較特別的是ConfigureAggregateCatalog的方法裡面加了一行程式碼,我下面有很長的註解,如果看不太懂也沒關係,下一篇會針對原始碼做解說,這邊只要記住,是把Shell註冊進MEF就對了;其他部分則沒甚麼改變。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.MefExtensions;
using System.ComponentModel.Composition.Hosting;
using Microsoft.Practices.Prism.Modularity;

namespace PrismDemo2HaveVisual
{
    public class TheBootstrapper : MefBootstrapper
    {
        protected override void InitializeShell()
        {
            base.InitializeShell();
            //將Shell指定給Application的RootVisual,
            //也就是說,此Application的最上層就是Shell了。
            Application.Current.RootVisual = (UIElement) Shell;
        }

        protected override DependencyObject CreateShell()
        {
            //產生Shell。
            return Container.GetExportedValue();
        }

        protected override void ConfigureAggregateCatalog()
        {
            base.ConfigureAggregateCatalog();

            //這裡很有趣,AggregateCatalog這個變數是一個AggregateCatalog型別( 別懷疑,原始碼就是這樣,大小寫都一樣 )
            //而我們這邊要多加一個AssemblyCatalog進去這個Collection裡面,
            //而使用new AssemblyCatalog帶入的參數,會自動去搜尋這個Assembly裡面有符合的AssemblyCatalog,
            //我們的目的就是希望把Shell加入進去。
            //那為何用this呢?,因為這裡面就含有Shell( 也就是Shell.xaml.cs ),
            //而這個Shell的程式碼裡面有Export,而這個Export就是這裡MEF需要的。
            //但是Shell和這個類別好像沒關聯阿!?
            //原因是因為this.GetType().Assembly這個地方,Assembly代表的是組件,
            //換言之,他搜尋的層級並非只是這個Class.而是整個NameSpace的層級,
            //剛好,好死不死,Shell和這個class的NameSpace是一樣的。
            
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(this.GetType().Assembly));
        }

        protected override IModuleCatalog CreateModuleCatalog()
        {
            //最先進來
            ModuleCatalog moduleCatalog = new ModuleCatalog();

            //加入模組,這裡只是單純的加入模組,並不會決定放置的位置。
            moduleCatalog.AddModule
            (
                new ModuleInfo
                {
                    InitializationMode = InitializationMode.WhenAvailable,
                    Ref = "Module1.xap",
                    ModuleName = "Module1Impl",
                    ModuleType = "Module1.Module1Impl, Module1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
                }
            );

            return moduleCatalog;
        }
    }
}

到這邊,Bootstrapper就算完成了。

更改App.xaml.cs

我們改用TheBootstrapper為主要的啟動物件。

private void Application_Startup(object sender, StartupEventArgs e)
    {
        (new TheBootstrapper()).Run();
    }

最後,我們要建立一個實作IModule的物件。

建立實作IModule的物件Module1Impl

同樣的,我們最後必須建立一個實作IModule的物件,當此物件被建構的時候,會去利用MEF來注入一個實作IRegionManager的類別TheRegionManager,而在運作整個Prism的時候,並會利用TheRegionManager來將這個Module注入到Shell裡面的特定位置。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.MefExtensions.Modularity;
using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.Regions;

namespace Module1
{
    [ModuleExport(typeof(Module1Impl))]
    public class Module1Impl : IModule
    {
        
        [Import]
        public IRegionManager TheRegionManager { private get; set; }

        #region IModule Members

        public void Initialize()
        {
            //由外面傳進來的RegionManager,RegionManager用來控制此View要與哪個XAML的Region做關聯。
            TheRegionManager.RegisterViewWithRegion("MyRegion1", typeof(Module1View)); 
        }

        #endregion
    }
}

就這樣,常常得撰寫過程後,就完成了,整個專案的文件夾,會如下圖。

image

後記

如前面所說,Prism的入門比較高,但是好處卻是很大的,藉由Module的拆開,我們就可以很輕鬆地拆開來開發,而不會整個架構弄得亂七八糟,測試等等的流程,也會簡單許多,程式碼也會乾淨許多,但學習曲線是比較高的;最後,寫完這篇,或是看完這篇的人,或許還會有許多疑問,這時候,我們就準備要進入Bootstrapper的原始碼來看看了,下一篇,會介紹比較底層的架構,相信看完,會更加的了解,為什麼要這樣做。

參考資料

2012年3月18日

Prism - 第一個!超簡單Prism範例

這篇的內容,主要是翻譯於這個網站的內容,是由國外的Nick Polyak高手所寫的,然後再加上小弟雜多的解釋內容XDD,所以內容不是百分百和原網站一樣,而且差異甚大,如有不好之處,也請各位多多包涵 ( 所以這篇可以算是讀後心得了,不算翻譯文了.. )

最簡單的Prism程式

這裡示範的第一個最簡單的Prism程式,為什麼叫做最簡單呢!?因為這個範例裡面完全沒有任何的視覺效果,也就是說,不會放一些啥Button等等之類的Control,只有最簡單的東西,運作出來的結果如下,我們可以看到畫面非常的單純, 單純到沒有任何東西XDD。

image

雖然一片空白,但裡面有很多學問=w=,接下來,我們看看怎樣來做這個範例。

實作Main Project

首先我們先建立一個Silverlight應用程式,並且把不需要的東西先刪除掉,這裡我們把MainPage.xaml刪除掉,所以目前專案架構會變成如下圖;因為這個範例我們沒有打算使用到視覺的部分,只是單純的希望能了解他的架構,所以我們用不到MainPage.xaml,就先刪除掉吧。

image

這邊我們需要參考兩個dll,這兩個dll分別在安裝Prism的bin目錄下面,分別是Microsoft.Practices.Prism.dll和Microsoft.Practies.Prism.MefExtension.dll。

image

接下來,我們要改變一下App.xaml.cs的程式碼,位置如下圖。

image

我們打開App.xaml.cs的程式碼,會發現裡面有錯誤;這是很正常的,因為我們已經把MainPage.xaml砍掉了,所以我們要改變一下這邊的程式碼。

image

修改App.xaml.cs的Application_Startup

改成如下;打的時候會發現TheBootstrapper找不到,不過那是正常的,因為這個Class我們還沒撰寫,我們這邊改用TheBootstrapper來取代原本程式執行時預設顯示的View,如果是原本程式架構,當程式執行時,會將MainPage.xaml給實例化起來,並且變成預設的根畫面( RootVisual,也就是最底層的畫面 ),但我們使用Prism時,不會使用原本的MainPage.xaml ( 無論是不是這簡單的範例都一樣,都會改變這行);因為使用Prism的時候,需要的東西和原本預設的MainPage.xaml是完全不一樣的,所以改用Prism時,我們會使用自己建立的Bootstrapper Class來產生整個Prism所需要的東西,而這裡我們自己建立的Bootstrapper Class稱為TheBootstrapper。

private void Application_Startup(object sender, StartupEventArgs e)
{
    (new TheBootstrapper()).Run();
}

撰寫Bootstrapper Class

接下來,我要要建立一個TheBootstrapper.cs類別,內容如下;這個Class將替我們產生Prism所需要的Shell( 也就最上層的View )和整個底層的組件,Bootstrapper也會註冊一些需要用到的服務( 這裡使用MEF,所以必須繼承於MefBootstrapper )。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.MefExtensions;
using Microsoft.Practices.Prism.Modularity;

namespace PrismDeom1NoVirual
{
    public class TheBootstrapper : MefBootstrapper
    {
        protected override void InitializeShell()
        {
            base.InitializeShell();

            // 這裡是給Silverlight用,如果是WPF會不一樣。
            Application.Current.RootVisual = (UIElement)Shell;
        }

        // 建立Shell的方法,shell在Prism Application是主要的View 
        // 在這個範例,我們只想了解BootStrapper,所以我們把原本的MainPage刪掉。
        // 並且利用Grid當作主要的Shell
        protected override DependencyObject CreateShell()
        {
            return new Grid();
        }

        protected override IModuleCatalog CreateModuleCatalog()
        {
            ModuleCatalog moduleCatalog = new ModuleCatalog();

            //在這邊,我們使用moduleCatalog來加載模組進來。
            moduleCatalog.AddModule
            (
                new ModuleInfo
                {
                    InitializationMode = InitializationMode.WhenAvailable,
                    Ref = "Module1.xap",
                    ModuleName = "Module1Impl",
                    ModuleType = "Module1.Module1Impl, Module1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
                }
            );

            return moduleCatalog;
        }
    }
}

在這邊,需要注意到這個Class執行Function的一個順序性( 未來會有一篇來探討原始碼 ),我們接下來看看這順序性是如何,我們這個Bootstrapper只有Override三個Function,你會發現他最先執行的Function是CreateModuleCatalog(),也就是說,他會先建立moduleCatalog這個Class,這個Class的用途是紀錄目前有哪些module,並準備利用MEF的方式去做個組合,寫法就如上面的程式碼一樣( 等下會去建立Module );第二個執行的Function是CreateShell(),我們把原本在Application_Startup方法裡面建立View的任務,移到這裡來,而這邊,我們直接new一個Grid,畢竟原本的MainPage.xaml被我們刪除掉了;第三個要執行的Function是InitializeShell(),除了原本MEFBootstrapper原本就該執行的程式外,我們也把Application_Stratup指定RootVisual的任務,寫在這邊;或許有人會問說,為什麼我會知道順序!?其實很簡單,因為我翻過原始碼…

建立Module Project

緊接著,我們要來建立Module,在Prism裡面,通常會把Module建立成獨立的專案來進行,所以我們建立一個新的專案,這邊要特別注意,要選擇的是Silverlight應用程式( Silverlight Application )而非Silverlight類別庫 ( Silverlight Class ),這是因為Module是一個xap,而非dll。

image

接下來,我們不需要額外的測試頁,所以把測試頁的勾選拿掉。

image

建立完新的專案後,把APP.xaml和MainPage.xaml刪除到( 這是因為我們這個範例沒用到 ),刪除完後,並建立一個Class,名稱取為Module1Impl.cs,完成後如下。

image

接下來,又要參照一些dll了,除了上面的那兩個dll要參照進來,還需要參照.NET Framework內建的System.ComponentModel.Composition。這裡因為我是使用Silverlight 5,所以使用5.0版本。

image

參照完後,在Module Project的地方,需要特別注意,我們要把參照到的Microsoft.Practices.Prism和Microsoft.Practies.Prism.MefExtension,複製到本機的選項改為False,這點要特別注意,如果設定為True,程式還是可以跑,也不會報錯,但就是不會加載Module進來 ( 只需要改Module的專案。 )。

image

撰寫Module1 Class

接下來,我們要撰寫Module,Module必須實作於IModule,而這邊會使用ModuleExport屬性來標記,讓Prism知道這是一個Module。

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.MefExtensions.Modularity;

namespace Module1
{
    //利用ModuleExport屬性來標記,這是一個Module
    [ModuleExport(typeof(Module1Impl))]
    public class Module1Impl : IModule
    {

        #region IModule Members

        public void Initialize()
        {

        }

        #endregion
    }
}

最後,我們可以設定中斷點在這邊,當程式執行的時候,如果有進到這個中斷點,就表示有順利的去加載這個Module了。

image

後記

做到這邊,最簡單的Prism程式就完成了,在Prism裡面,如果用的是MEF框架,那建議先稍微懂一下MEF會比較好,不然做下來可能會湖煞煞,如果有時間,也建議把IoC的部分有個理解,因為有很多地方,都是利用注入的概念;其實Prism就如許多前輩講的一樣,學習門檻真比較高,光是這邊文章,打打停停,也打了三天,而且其實還有很多東西還沒講得很仔細,這部分未來會再慢慢補充回來,如果覺得很有趣,迫不急待的人,也可以先看參考資料,繼續下去=w=。

參考資料

2012年3月16日

第七次Study4 點課幫 SQL Server技術分享會 12-0331 活動開始!!

4/1更新

很感謝大家今天熱情的參與與討論,本次活動已經順利圓滿落幕了!,也很感謝Cat姊借到這個安靜又舒適的場地,還有今天所有的工作人員熱情的參與,才能讓這次活動順利的完成,讓小弟無後顧之憂!

今天第一場是由小弟談Cloud,然後講到Windows Azure,到最後的SQL Azure,本來是預計全部重心都放在SQL Azure的,但後來發現報名的人,各行課業都有,所以調整了一下課程內容,讓寫程式的,看程式的,不寫程式也不看程式的人,都能得到想要的東西;而整個過程也主要偏向概念為主,所以投影片的內容反而是空空一片XDD,都是現場講居多,另外也怕現場過於煩悶,所以也加了許多Ruddy老師幾年前所使用的梗XDD,然後再加上自己編的一些笑話,老實說,效果比想像中的好,也希望大家除了聽笑話之餘,也能學到許多東西=W=

第二場是由神人級的James大來主講,James大準備了這次的課程,整整花了30hr準備投影片,看了11場美國的SQL Server 2012發表會,整合了無數多的資料,據說,因為時間限制,所以刪除了2/3,其實小弟一聽就明白,還要準備拍續集就對了啦XDD,所以這場真的是物超所值,不但從2005開始講起,讓大家了解歷史的演進,更由淺入深( 深到超級深= = ),來讓整個課程緊湊而不會泛於空洞,而整個過程下來,更由James大的笑話帶動,讓整個內容不過於沉悶,所以未來還有續集,也請大家把握機會,多多參與喔!!

投影片下載

如果沒有收到Mail而看到連結的人,請不要訝異,是小弟先把投影片放上來,因為會員資料那邊還沒整理完畢,所以通知的Mail還沒有寄發,如果一個月後,都沒有收到任何的Mail,可以與小弟聯絡,因為可能是Mail Key錯等問題,謝謝。

Windows Azure 和 SQL Azure

從SQL 2005到SQL 2012

第七次活動展開!

不知道大家最近有沒有注意到一件事情,今年來最大的盛事之一,就是SQL Server 2012即將發售了!,相信大家一定會有許多的疑惑,到底新的SQL Server 2012帶給我們怎樣的東西,所以在SQL Server發售之際,我們特別請到SQL Server高手James,來替我們中部地區的朋友們,搶鮮講解這次SQL Server 2012帶來怎樣的改變!

另一個議題是近年來火熱的議題,也就是雲端,既然談到了SQL Server,那我們也來看看,SQL Azure ( 雲端版本的SQL Server ),並且來初次的體驗一下。

此外,這次因場地的因素,人數有所限制,請盡早報名喔!

Study4 點課幫 SQL Server技術分享會 12-03131

每人有最低消費120元,可以兌換餐飲

時間 : 2012 03/31 (六) 12:30 進場,13:00 ~ 17:00
地點 : 美村路一段264號 -  米諾亞早餐店
課程大綱:

  1. SQL Azure 初次體驗 – Sky
  2. SQL Server 2012 新功能探討 – James

檢視較大的地圖

2012年3月12日

Visual Studio - Visual Studio 11 Beta 使用感

這篇完全沒有講解Visual Studio 11的新功能,純粹只是小弟的追星的一個紀錄和感想XDD,所以如果想要知道有啥新功能的大大,也請多見諒了。

2012/03/11 安裝了Visual Studio 11 Beta

其實裝的過程中沒有甚麼需要特別注意的地方,通常只要下一步下一步就可以把Beta裝完,而不知道是不是因為是Beta的關係,也沒啥東西可以選,按下去,就全裝了= =,另外,小弟還是建議,如果真的要玩,用vm一台出來玩吧,不要拿自己的工作環境開玩笑XD。

因為小弟在Win 8下使用的帳號不是Administrator權限,所以安裝途中,會要求我輸入Administrator密碼。

Parallels 圖片 1

安裝的完成的畫面,其實這次的安裝Logo還滿好看的!!

Parallels 圖片 2

啟動後,第一次一樣會要求選擇工作的環境,雖然小弟目前在寫WPF和Silverlight,但我還是喜歡用Web Developer的開發環境。 ( 其實也只是版面配置不同罷了- - )

Parallels 圖片 3

然後就稍微等待一下的設定。

Parallels 圖片 4

以下就是開啟的畫面,老實說,我嚇到了!!怎麼會那麼整潔呢!!而且幾乎沒有啥顏色XDD,忠實地反映出程式人的灰暗…

Parallels 圖片 5

老實說,這次的Visual Studio 11 Beta,我和我同事看到的第一個感覺,就是灰暗的程式人生,雖然感覺整個變整潔了,但是因為按鈕的logo也變成單一顏色了,原本旁邊專案總管的檔案Logo也變成單一顏色了,有時真的會眼花,找不到要檔案,如果扣除掉這點,感覺上視覺事還滿不錯的。

其次,Visual Studio 11 Beta裡面也直接支援了Team Foundation Serivce ( TFS線上版 ),內建了,ASP.NET MVC 4、.NET 4.5、Metro、sql server compact 4.0 SP1、Silverlight 5、Cloud等等。 ( 如果沒內建,就很怪了吧.. )。

其次,對於TFS的支援更加的方便了,可以將目前手頭上的Work Item列在右邊,分類也更完善,總歸一句不滿意的地方,就是Logo都灰灰暗暗的… ( 不知道是不是為了讓眼睛不會那麼疲勞的配色XDD )。

這次的初次使用心得大概就這樣,目前已經把這個環境放到正式環境去開發看看使用,所以有啥心得,再繼續報告!

3/10 - 點部落的上課與聚會

老實說,除了Study4和官方的上課外,已經好久好久沒有參加過類似的活動了 ( 以前都是電動聚會- - ),而這次,小弟我十萬分的感謝點部落的大大們,給小弟這個機會,讓小弟來參加這有如夢幻籃球隊的明星邀請賽。

早上一大早準備好後,就搭著高鐵北上前往,原本溼答答的天氣,也隨著小弟我的心情開始放晴( 自我感覺良好XDD ),而活動開始後,光進會場,就感受到高手群的魄力,雞皮疙瘩都跑出來啦!!

第一場是Clark大大主講DDD,說到Clark,他的blog就是鼎鼎大名的昏睡領域,去年在看MVVM的時候,Clark大大的文章有很大的幫助喔!!,而且Clark是設計架構高手喔!( 座我前面的剛好是下一場的講師黃偉榮 )

Photo 12-3-10 13 49 22

Wade黃偉榮也是實力派的喔!第二場他講ASP.NET MVC搭配NHibernate,對於使用EF的小弟我,這部分也給了小弟一個震撼教育,也很感謝Wade事後又和小弟分享了一些東西!!

接下來,大鈞哥,介紹了一下交換書的規則,大鈞哥一上場,就絕無冷場,這裡原本是想拍書名的,但是太遙遠了實在是拍不到- -..

Photo 12-3-10 14 50 12

這裡算是送書的重頭戲了,Ruddy老師不虧是超SS級的老師,如果依據幽遊白書來說,就等同於雷禪等級;老師送的書,果然一堆人搶XDD,而小弟要送的書,也拖老師的簽名之福,順利地送出去了 ( 感謝老師=W= )。 ( 其實這已也是想拍書名,結果也拍不到= = )

Photo 12-3-10 16 29 32

其次,這次也很感謝主辦單位中場抽空的時候,介紹了我們已經是風中殘燭的點課幫,小弟我在完全不知道,且沒準備的情況下,就被拱上台胡言亂語了XDD,老實說,上台後腦袋就是一片空了= =;另外,也很感謝91哥很給面子的拿了我的書,超擔心送不出去>"<,還有Gipi的一路相陪XDD,Jon的熱情,才不至於讓小弟我孤僻的躲在角落XDDD,還有大鈞哥無時無刻的熱血支持!Ruddy老師的配合簽名>"<,Franma大的教導,總之,這次真的很可惜沒辦法繼續和各位大大聚餐,但真的是收穫很多,也很謝謝各位大大如此的照顧小弟這個新人=w=,中間也有些機會想和小朱、Clark等大人聊聊天,但小弟太害羞啦..希望下次還有機會能認識更多神人^^。

最後,台北真的是個好環境,擁有技術力超高的神人,擁有無限熱情的大家,能無時無刻的討論這些技術,真的是夢想中的天堂,看著TW MVC等等的社群一個接著一個成立,小弟真恨不得自己也生在台北>"<,也希望未來,能有機會加入大大們的社群,一起痛快地討論技術!

真的謝謝各位!! 愉快的台北點課幫上課聚會交換書之遊,結束!