本文章是由機器翻譯。

奧斯陸 」 的基本概念

建置: < 奧斯陸 > 平台與中繼資料為基礎的應用程式

Chris Sells

本文根據搶鮮版的 「 奧斯陸平台。所有的資訊有變更。

本文將告訴您:

  • > 奧斯陸 > 和中繼資料
  • MGraph 和 MSchema
  • SQL 指令碼、 封裝和部署
  • Visual Studio 整合
本文將使用下列技術:
> 奧斯陸,> SQL Server 2008

內容

中繼資料
奧斯陸 」 上建置
MGraph 和 MSchema
SQL 的產生
封裝和部署
Visual Studio 整合
範例程式碼

Microsoft.NET Framework 的 應用程式根據 傳統上是由一組已編譯的程式碼] 和 [一組相關聯的資源所定義的。例如,ASP.NET 應用程式所定義已編譯程式碼 (組件),提供您的網站,並在資源檔 (.aspx 檔),定義頁面本身的邏輯。程式碼會執行的 CPU,(在之後編譯),並由 ASP.NET Runtime 解譯頁面。同樣地,Windows Workflow Foundation (WF) 會讓您定義所有的只是要由 WF Runtime 所解譯的資料都是一系列設定的活動的行為。

結合 ASP.NET UI 端和 WF 行為上端和您可以開始假設建置整個應用程式,幾乎完全資料,填入未提供在執行階段的行為只能使用程式碼。

資料的磁碟機這些執行階段有時候稱為中繼資料。中繼資料可以定義為說明的應用程式資料例如,如何呈現在首頁的網頁,或購買的工作流程的運作方式。您的應用程式資料會表示例如王俊元放入您的網站或他的送貨地址上他購物車在您簽出工作流程的應用程式執行的狀態。

若要提供一套通用的工具,讓它可以儲存在一個地方,提供一般應用程式的資料相同的功能集定義中繼資料,Microsoft 建立 「 奧斯陸,"平台建置資料導向的應用程式。 "奧斯陸 」 由三個項目組成: 語言統稱為 M"系列 Visual 資料管理工具會呼叫 」 象限 」,而且資料存放區呼叫存放庫。

在本文中,我將介紹部分 「 奧斯陸平台的概念。我也將介紹您在工具和技術,您需要使用練習中放入這些概念。尤其,我將討論如何奧斯陸 」 讓您建置中繼資料驅動的應用程式,使用 [MSchema 的和 MGraph 工具中和中 「 M 」 中定義型別和值,以及部署到儲存機制的基本概念。

< Olso >: A 新的方法,以實作的舊的概念

任何新 的 資料導向的架構。請考慮另一個範例: Windows Presentation Foundation (WPF)。大部分的 WPF 應用程式會寫入的方式大部分的應用程式被組成 XAML 在執行階段載入並由 XAML 剖析器解譯。這是磁碟機的一個 WPF 應用程式定義的中繼資料。您可以藉由載入,或在開發人員不知道在編譯時期的執行階段產生 XAML,即使變更 WPF 應用程式的定義。

不過,有什麼魔法 XAML (編譯至表單,稱為 BAML) 的相關資源,以與您應用程式程式碼的內建 — 它無法,輕易地被載入到不同的檔案或甚至關聯式資料庫。如果它已載入的資料庫,請 WPF 載入器會執行存取應用程式定義,而不是載入資源的 SQL 查詢,但使用者應該不知道的差異。如果應用程式定義會和從載入的所有資料庫資料無法更新在集中式,讓應用程式的開發人員能夠將變更傳播不 re-deploying 每一個要執行的用戶端應用程式。這是,事實,殺人的功能網頁和值得是否在執行瀏覽器中或不,向驅動的應用程式,所有類型之一。

現在,只要您的應用程式載入一個中央位置時,您將需要多重使用者的功能,例如複寫、 securit、 Y 和版本控制。中斷連線的使用者和世界不同的地區設定的使用者,您也會希望支援。

而最後,應用程式定義可以用於不只是驅動的應用程式的執行個體。它們可以用來在開發階段測試是否根據規格,正在執行的應用程式的特定部分。它們可以用來在執行階段顯示哪些部分取得使用或需要疑難。它們可用來標記問題所以開發人員可以看到,特別什麼造成問題。需要的應用程式的中繼資料時,提供所有的現代索引、 調整、 複寫、 安全性、 版本、 當地語系化的查詢功能、 離線的能力的資料庫。

這基本上是奧斯陸 」 是所有關於 — 使用 SQL Server 的強大功能儲存應用程式的中繼資料。我們開始標記二進位檔案,主控台位元,以取得主控台視窗,而不需要撰寫,程式碼的使用中繼資料到磁碟機至少是因為 Windows 已經使用的應用程式的行為。 "奧斯陸 」 只要是 formalizing,一般化您的應用程式的中繼資料和提供相同的電源與工具,用於您的應用程式的資料。

中繼資料

是使中繼資料有別於您的應用程式資料時中繼資料的應用程式很少變更 — 的一般來說,即使在 wildest 的啟動每天在新版本的網站會推入 Live 只會變更。通常應用程式的資料變更相當大量的另一方面,— 全天、 每天受歡迎的網站上,哪些使用者所管理的。

這進一步採取,2007 時,它已釋放,但資料已會變更數千次就今天我輸入字元,並移動滑鼠來操控文件我在工作沒有變更中繼資料描述,我使用來輸入此文件的文書處理器。事實上中, 繼資料會寫入因此很少,在許多情況中它將它傳遞像.NET 組件] 或 [先行編譯的 XAML 檔案內嵌為資源,為組件中的類別定義的唯讀套件中的。因為開發人員通常會撰寫靜態的性質而定其應用程式,像是按鈕的 ASP.NET] 網頁中定義事件處理常式中繼資料,變更應用程式的中繼資料 seldomly 不是不好。

不過,種類的錯誤,我們目前中繼資料的基礎結構的相關的重點是 Tools for 定義和讀取中繼資料因此不同於要使用的應用程式資料。

我可以讓我之類的查詢、 設定安全性、 複寫,和版本控制的一組功能強大的工具開發應用程式讀取和寫入資料透過一個關聯式的資料庫。但如果我要在查詢.NET Framework 中繼資料,我就會有更有限的工具: 反映 API,基本上。

.NET Framework 工具,管理中繼資料的我用來破解的工具非常不同的進一步,開啟 SQL 中繼資料。如果我希望應用程式的資料和中繼資料之間的查詢 — 透過目前正在執行的工作流程的定義,工作流程的查詢 — 我了建置自己的工具,因為是不同的資料來源: SQL 與可延伸的物件標記語言 (XOML) 檔案。

奧斯陸 」 上建置

有許多您可以建立與奧斯陸"件事。 當我們在內部討論案例時,討論區通常由下建置的應用程式的資料。不過,您會發現在我以 Olso 」 的一部份所列出的一組我沒有提到任何執行階段。事實上,.aspx 檔案不是在 ASP.NET,不太有用,而且不 WF 的 XOML 檔案會較不吸引人。

有很多的執行階段,並服務正在開發的將會利用奧斯陸 」。 其中包括網域特定語言 (DSL) 和象限 」 設計工具的 ASP.NET Web 應用程式、 WCF Web 服務,和 EF 資料庫。您可以載入存放庫的資料,並將磁碟機的執行階段。

奧斯陸 」 儲存機制被專為應用程式的企業開發人員建立他們自己的儲存機制的類似項目儲存中繼資料。舉例來說,奧斯陸 」 會是好平台,會讓作業人員查詢,並瞭解電腦的組態,輕鬆地,] 或 [類似的電腦組態資訊的儲存機制、 操作程序和指令碼的儲存機制。開發人員,因為在中繼資料,儲存機制提供統一且 queriable 存放區有可能實回答的問題,例如 「 哪些應用程式和類別作某些方法嗎? 」 並 」 會變更這個方法影響效能 」 嗎?

了解分散式應用程式,可能是另一個採用 「 奧斯陸的潛在區域。結合程式碼剖析程式碼涵蓋範圍,會載入測試,並架構的資料,存放庫內的資料將會讓開發人員,例如,快速地解決效能問題瀏覽至相關的分散式元件、 檢查各種的組態參數的設定檢視相關的實作詳細資料。此外,它將允許的報表設計的缺失自動靜態分析工具的開發。

尤其是 tickles 我喜歡的一個區域是,部署和安裝。藉由定義網域特定語言的安裝套件,和它們載入存放庫中,開發人員會將語言服務的任何現代化的語言與查詢工具一起取得原則的規範。例如,您無法查詢是否設定受到保護,以適當的授權合約。

以下是範例: Microsoft 下載中心網站的客戶提供高度的可調整的下載項目。檔案在該網站上裝載它們必須封裝在 Microsoft Installer (MSI) 檔案和標記的使用者授權合約 (EULA) 的。之後對此有一半十次使用 GUI,在 Visual Studio 中,我去尋找的自動化的解決方案,並找到在 Windows Installer XML (WiX) 可讓我可以使用 [XML] 來定義安裝程式,並將它編譯成 MSI。

[圖 1 ] 顯示 WiX XML 的範例。在培訓的注意到這可能看不起來像的改進透過執行一個圖形的 UI 但一旦您已完成幾次相同的 27 個滑鼠鍵筆勢,您的程式設計人員將會接管。

[圖 1 WiX XML 建立 MSI 檔案

<?xml version='1.0' encoding='Windows-1252'?>
<Wix xmlns="https://schemas.microsoft.com/wix/2006/wi">
  <Product Name="SuperNotepad" Id="d65d2125-560b-4ba9-bdca-3b3bcd3f7b70"
           UpgradeCode="ac5c9dac-b3f0-469a-8f1a-02c2566eee33" 
           Language="1033" Codepage="1252"
           Version="1.0.0.0" Manufacturer="SuperNotepad Corp.">
    <Package Description="A really super pad for notes" 
             Manufacturer="SuperNotepad Corp."
             InstallerVersion="200" Languages="1033" Compressed="yes" />
    <Media Id="1" Cabinet="setup.cab" EmbedCab="yes" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="ProgramFilesFolder">
        <Directory Id="Directory3" Name="SuperNotepad Corp.">
          <Directory Id="INSTALLDIR" Name="Better NotePad">
            <Component Id="Component1" 
                       Guid="f7554ac8-32cd-44fb-bf85-0559c7d2e15c">
              <File Id="File1" Name="Manual.txt"
                    Source="C:\temp\SuperNotepad\Files\manual.txt" />
              <File Id="File2" Name="dependency.dll"
                    Source="C:\temp\SuperNotepad\Files\dependency.dll" />
              <File Id="File3" Name="BetterNotePad.exe"
                    Source="C:\temp\SuperNotepad\Files\notepad.exe" />
            </Component>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
    <Feature Id="Feature1" Level="1">
      <ComponentRef Id="Component1" />
    </Feature>
  </Product>
</Wix>

MGraph 和 MSchema

雖然我可以自動建立某些程度的 WiX XML 的我真的不想撰寫在海角括弧內的 [我的設定。 "奧斯陸 」 可讓我"M",一系列的語言包括 MSchema MGrammar,、 MGraph 中撰寫它們。(在可找到 [MSchema] 和 [M­grammar 的規格 」奧斯陸 」 模型語言規格「 和 」MGrammar 語言規格"分別)

讓我可以讓您快速的簡介 MGraph 和 MSchema (我將探索 MGrammar 日後的文章)。如果您想在家裡播放以及我強烈建議在 Mr。Epl 工具隨附於 「 奧斯陸"SDK。(「 Mr。Epl 」 是如何,我們讀出的代表 M 唯讀評估-列印-迴圈的 MREPL.EXE)。 您就可以呼叫 Intellipad 隨附於 「 奧斯陸 」 的文字編輯器中使用它從 [開始] 功能表中, 選擇 [Intellipad (已啟用的範例) 的 SDK 按 Ctrl ++/ 要顯示在的 mini-buffer] 和 [後面按一下 [輸入"SetMode('MScriptMode') 」 (沒有引號,但大小寫的問題),輸入。

MGraph 會是定義的結構化資料 (稱為更值) 的執行個體的語言。這個範例中,我已定義資料的三項: 整數匿名 」、 「 的匿名的集合,三個的整數之和 「 名為"pt1 X 和 Y,兩個整數兩個欄位的資料錄:

42
{ 1, 2, 3 }
pt1 { X = 10, Y = 20 }

MSchema 會是資料上定義條件約束的語言。 MSchema,中的一組條件約束會繫結一起為型別。 此處我已定義兩個具名型別 」、 「 只有這些值小於 256,Integer32 型別中限制內建 SmallInteger 型別和 「 具有兩個欄位 X 和 Y: 一個點實體型別 (M 的記錄類型名稱)

type SmallInteger : Integer32 where value < 256;
type Point { X : Integer32; Y : Integer32; };

X 和 Y 會受限於保留-2,147,483,648 2,147,483,647 之間的整數值。

任何人讀取此文件已經熟悉 CLR。 CLR 會使用所謂 「 名義上鍵入,」,,命名值屬於單一型別。 " M,」 從另一方面來說,根據結構輸入,更像 XML。 在一個結構的型別的世界,只要資料符合條件約束的型別設定任何數目的型別可以屬於值。 若要檢查值是否為型別所定義的集合中,您使用運算 in"子 (此處顯示從 [Mr 內。 Epl 工具):

M>>> type SmallInteger : Integer32 where value < 256;
M>>> 4 in SmallInteger
true
M>>> 4 in Integer32
true
M>>> 256 in SmallInteger
false
M>>> 256 in Integer
true

這裡您可以看到 4 在 SmallInteger 和的 Integer32,但是 256 的 Integer32。 型別的成員也可以檢查實體值:

M>>> type Point { X : Integer32; Y : Integer32; };
M>>> { X = 100, Y = 200 } in Point
true
M>>> pt1 { X = 10, Y = 20 }
M>>> pt1 in Point
true
M>>> pt1 in { X : SmallInteger; Y : SmallInteger; }
true
M>>> pt1 in { X; Y; }
true

您可以看到,之具名與未命名的 X,Y 」 組都點且,在已命名的兩個欄位 X,Y 組會 SmallInteger 的值這個時間定義要為您檢查匿名型別。 最後一行會表示,在名為 X,Y 組放入一組值的欄位名為 X 和 Y,以它們的值沒有限制 — 它們可以是字串或日期或集合或任何。

以下是另一個範例。 在這種情況下因為在名為 X,Y 組不也 Z 欄位,它不符合需要的 X、 Y 和 Z 欄位的匿名型別:

M>>> pt1 in { X; Y; Z; }
false
M>>> pt1 in { x; y; }
false

進一步,最後一行顯示的 M 區分大小寫。

最後,您想瞭解預設值和集合標記法:

type Product {
    Name : Text;
    ...
};

type Package {
    Product : Product; // required value
    Keywords : Text*; // collection of 0 or more values
    Description : Text?; // optional value
    Comments : Text?; // optional value
    Manufacturer : Text; // required value
    InstallerVersion : Integer32 = 200; // default value
    Language : Integer32 = 1033; // default value
    Compressed : Logical = true; // defaults value
};

這裡您會看到從 WiX 模組型別的封裝。 每個產品 (的 MSI 安裝程式中的最上層的概念) 有封裝有文字的關鍵字、 選擇性的描述和註解、 所需的製造商、 會以預設值為 Windows Installer 2.0 語言,預設為美國的安裝程式版本的選擇性組 英文版) 和壓縮旗標的預設值為 true)。

必要的值會有產品和製造商沒有尾碼。 預設值會有等號] 和 [值,例如 InstallerVersion 和語言。 選擇性的值會有問號尾碼例如描述和註解。 集合值 (即使用零個或多個值) 會結束的星形。 問題標記和星號觀念 (? 和 *) 要從您的我的最愛的規則運算式語言 Kleene 運算子的提醒您。

以下是一個範例封裝的值:

Products { 
    SuperNotepad : Product* {
        Name = "SuperNotepad",
        ...
    }
}

Packages : Package* where item.Product in Products {
    Package1 {
        Product = Products.SuperNotepad,
        Description = "A really super pad for notes",
        Manufacturer = Products.SuperNotepad.Manufacturer,
        Keywords = { "Installer", "Super", "Notepad", "Sample" }
    }
}

此處我了產品與的整個套件的一部分。 請注意我有兩種類型的條件約束。 在第一個是表單的 「: 東西 」,為在:

SuperNotepad : Product* {

這稱為型別 ascription 和條件約束 (所有值以符合條件約束型別的括號內。

第二個條件約束是 Where 子句,告訴 「 M 編譯器哪裡可以找到產品的實體值的儲存區:

Packages : Package* where item.Product in Products {

也請注意兩個值會有名稱 (SuperNotepad 和 Package1)。 在的 MGraph 語法可讓的名稱,用來初始化值的圖表,這樣圖形的一部分可以參考另一個組件,而不複製資料的中央中。 我這樣,這樣我就可以參考的套件定義中產品。

有用為 Mr。 會是 Epl,您會想要使用文字編輯器的較大的項目。 Visual Studio 2008 和 Intellipad 提供語言服務讓您編輯 「 M 愉快經驗。 例如,以檢查了句法上有效的項目,您可以尋找資料提示上顯示的錯誤 (例如,在遺漏結尾雙引號),紅色不規則曲線。

所有 「 M 」 程式碼必須是在模組之內,很像所有的.NET 程式碼必須在命名空間內]。 此範圍之型別和值。

如果缺少的不規則曲線,沒有足以讓您滿意,您也可以從命令列執行 「 M 編譯器:

C:\>set path=%path%;"c:\Program Files\Microsoft Oslo SDK 1.0\Bin"
...
C:\>m.exe /t:none wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>

如果不有 「 M 編譯器所報告的任何錯誤,程式碼都將是初始狀態。 以下請注意除了您可以傳遞.m 副檔名給 m.exe,我正在也指定為目標 (透過 / t 參數) 的 [無]。 這表示只要執行語法檢查。 沒有目標參數,"M 編譯器會嘗試使用您的程式來產生 SQL 指令碼建立資料表] 和 [插入值。

SQL 的產生

如果您嘗試從 WiX 模型資料的範例位元產生 SQL,(之後加入結尾雙引號) 會得到像這樣的錯誤報告:

C:\>m wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\wixbits.m(16,9): error M2010: The referenced type 'Product' does not define an identity constraint.
...

如果您選擇的 M 的模式您也可以取得這個錯誤訊息 | 到達 SQL 預覽,從內部 Intellipad。 發生,是"M 編譯器嘗試產生 SQL 指令碼符合型別和程式中所定義的值。 它會嘗試將最上層具名的值對應 (稱為延伸) 建立資料表的陳述式和對應值本身插入陳述式。 不過,因為 M"有所有類型的一般用途的資料會描述使用,不是所有的對應至 SQL 建構 — 例如,不識別欄位的實體類型。 是仍然有效 「 M 」 但不是正確產生 SQL。

因為現代化的關聯式資料庫儲存和管理資料在棒環境時,就產生 SQL 是"M 編譯器的預設動作。 它具有所有類型的完美的功能,例如安全性,複製,版本,稽核,和上。 如果進行裝載您的資料使用的 SQL Server 您取得所有這些功能,加上強固性和效能的最佳化的主機。

要讓您 「 M 」 型別是與 SQL Server 相容的對應會需要的識別資料行,您可以使用下列程式碼加入:

type Package {
    Id : Integer32 = AutoNumber();
    ...
} where identity Id;

您可以看到我正在建立欄位名稱的識別碼並用 [自動編號] 函式來設定預設值。 然後,我新增的使用在何處,型別上的條件約束關鍵字標記為識別資料行識別碼欄位。 這在地方,我有足夠的資料,如 [圖 2 ] 所示之的型別取得有效的 SQL。

[圖 2 M 」 所產生的 SQL

...
create table [WixBits].[Packages](
  [Id] int not null identity,
  [Comments] nvarchar(max) null,
  [Compressed] bit not null default 1,
  [Description] nvarchar(max) null,
  [InstallerVersion] int not null default 200,
  [Language] int not null default 1033,
  [Manufacturer] nvarchar(max) not null,
  [Product] int not null,
  constraint [PK_Packages] primary key clustered ([Id]),
  constraint [FK_Packages_Product_WixBits_Products] foreign key ([Product]) references [WixBits].[Products] ([Id])
);
...

create table [WixBits].[Packages_Keywords](
  [_Id] bigint not null identity,
  [Packages_Id] int not null,
  [Item] nvarchar(max) not null,
  constraint [PK_Packages_Keywords] primary key clustered ([_Id]),
  constraint [FK_Packages_Keywords_Packages_Id_WixBits_Packages] foreign key 
  ([Packages_Id]) references [WixBits].[Packages] ([Id]) on delete cascade
);
...

希望 「 M 編譯器所產生的 SQL 會符合哪些您想自行撰寫。 模組名稱會對應到 SQL 結構描述名稱中。 請輸入名稱對應資料表名稱。 對應到 「 識別 」 欄位上的 [自動編號],以及識別條件約束會對應至在欄位上,主索引鍵條件約束]。 內建的 「 M 」 類型,例如 Integer32 和文字的對應,請執行對應的 SQL 型別,例如 int 和 nvarchar。 集合欄位 — [關鍵字] 欄位輸入的文字 * — 會對應至另一個資料表存放在零個或更多的項目,該項集合與對應的外部索引鍵條件約束中。 [圖 3 ] 說明對應值的方式。

[圖 3 對應至 SQL M"型別

insert into [WixBits].[Packages] ([Product], [Description], [Manufacturer])
 values (@WixBits_Products_Id0, N'A really super pad for notes', @WixBits_Products_Manufacturer0);
declare @WixBits_Packages_Id0 bigint = @@identity;

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Installer', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Super', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Notepad', @WixBits_Packages_Id0);

insert into [WixBits].[Packages_Keywords] ([Item], [Packages_Id])
 values (N'Sample', @WixBits_Packages_Id0);

封裝和部署

在預設輸出,「 M 編譯器會是您可能會要推入至 SQL Server 2008 執行個體的 SQL。 預設的情況下,該 SQL 被封裝為單一的 SQL 指令碼檔案中:

C:\>m.exe wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir wixbits.sql
...
11/22/2008  04:43 PM             2,545 wixbits.sql
...

您可以自由使用這個指令碼檔案,來填入您的 SQL 資料庫執行個體,但是想要,例如,如果使用 sqlcmd.exe 或 SQL Server Management Studio 大小寫。 不過,SQL 指令碼有許多的中繼資料比原始的 「 M 」 程式碼。 如果您想維持的中繼資料,且沒有值,如此,我在稍後會說明 — 您可以選擇 M"的影像封裝格式 m.exe /p:image 命令列參數:

C:\>m.exe /p:image wixbits.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.
C:\>dir wixbits.mx
...
11/22/2008  04:44 PM             9,073 wixbits.mx
...

wixbits.mx 檔案會為 「 M 影像檔,其中包含所產生的 SQL,以及資訊清單和其他中繼資料。 因為檔案是 OPC (開放封裝慣例) 格式時,您可以保持在其上的.zip 檔案的副檔名,並像任何其他的.zip 檔案中開啟它。 更重要的是不過,您可以使用 mx 檔案參考和部署。

當您建置.NET 組件時,您可以參考該組件做為您的建置程序的一部分,提取公用 (Public) 型別] 和 [到您的.NET 程式的靜態執行個體。 如果您使用 C# 或 Visual Basic 編譯器,從命令列,您可以參考現有的.NET 組件,使用 / (參考) 參數。 同樣地,如果您正在編譯程式"M,您可以採用 「 M 編譯器,從 「 M 影像的其他型別中提取 / 參數。 工作您必須先匯出您的型別或範圍從您正在參考的模組:

// WixbitsTypes.m 
module WixBits {
    export Product, Package; // export types
    export Products, Packages; // export extents

    type Product {...};
    type Package {...};
    Products : Product*;
    Packages : Package* where item.Product in Products;
}

然後您可以匯入型別和範圍的已匯出:

// WixbitsValues.m
module WixBits {
    import WixBits; // bring in exported types and extents
    ...
}

一旦您已建置 「 M 影像檔的匯出,您可以參考的"M 匯入程式在編譯時 (如需詳細資訊,請參魷 \ cs6 \ f1 \ cf6 \ lang1024 [圖 4 ).

[圖 4 的編譯已匯入之型別和範圍

C:\>m.exe /p:image /t:Repository WixbitsTypes.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsTypes.mx
...
11/22/2008  05:48 PM            28,332 WixbitsTypes.mx
...

C:\>m.exe /p:image /t:Repository /r:WixbitsTypes.mx WixbitsValues.m
Microsoft (R) "Codename M" Compiler version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\>dir WixbitsValues.mx
...
11/22/2008  05:50 PM             5,606 WixbitsValues.mx

除了型別和範圍,在其他 「 M 」 程式中參考的封裝,M 」 影像檔可以部署到 SQL Server 資料庫執行個體,以在的下列方式中使用 「 M 」 載入器公用程式 mx.exe 中,:

C:\>mx.exe /db:Repository /i:WixbitsTypes.mx /i:WixbitsValues.mx
Microsoft (R) "Codename M" Command-line Utility version 1.0.0925.0
Copyright (C) Microsoft Corporation. All rights reserved.

此處我正在使用 / db 參數來指定資料庫連接到,假設本機主機與資料庫伺服器,並在安裝兩個影像檔案。 我載入資料表 SQL 並以 [我的值填入這些表示我可以的使用提取它們我選擇的資料存取技術將還原 (或更新它們或將它們刪除或插入新的)。 在這種情況下我使用 sqlcmd 命令列工具:

C:\>sqlcmd -d Repository
1> select Name from WixBitx.Products
2> go
Name
----------------
SuperNotepad
(1 rows affected)

雖然 Intellipad 支援 「 M 語言服務現成,包括產生 SQL 的就沒有建置影像,或參考其他影像支援的機制。不過,Visual Studio 會支援這些功能。

Visual Studio 整合

奧斯陸"SDK 船,Visual Studio 2008 SP1 的內建支援。您安裝 SDK 之後,您就必須 「 M 」 專案範本安裝,如 [圖 5 ] 所示。

預設的情況下,您會 Model1.m 檔案加入至您的專案。這會提供你 Intellipad 在相同的 IntelliSense 功能。當您需要更多的模型檔案時, 您就可以您的專案,在 [方案總管] 中上按一下滑鼠右鍵,加入新的項目,然後選擇 「 M 」 模型範本。

fig05.gif

[圖 5 : 在 Visual Studio 2008 的 “M” 專案範本

進一步,如果您想參考現有的 「 M 影像您可以因此以滑鼠右鍵按一下您的專案,然後選擇 [加入參考,然後選擇 mx 檔案。例如,如果您想建立的專案,建置我已播放的值,並將參考了我已經示範型別看如 [圖 6

fig06.gif

[圖 6 原始程式碼與 mx 檔案參考的一個 “M” 專案

當您在建置時,您會看到錯誤清單] 中的錯誤,預期您和輸出會移到 \ bin \ Debug 或 \bin\Release (根據設定,您正在建置),包括同時,.sql 及 mx 檔案,以執行與您請參魷 \ cs6 \ f1 \ cf6 \ lang1024 調整 (例如輸出 mx 檔案上執行的 mx.exe)。所有這些相同的動作也可在新版 CTP 的 Visual Studio 2010 中運作。

在 Visual Studio 建置處理序由使用.mproj 副檔名的 MSBuild 檔) 所驅動 (請參閱 [圖 7 )。如果,這就會很方便您想要在您的專案檔中使用 「 奧斯陸 msbuild 目標檔案。

[圖 7 MSBuild"M"專案檔案

<?xml version="1.0" encoding="utf-8"?>
<Project ...>
  <PropertyGroup>
    <MTarget>Repository</MTarget>
    <MPackageScript>true</MPackageScript>
    <MPackageImage>true</MPackageImage>
    <MTargetsPath Condition="$(MTargetsPath) == ''">
      $(MSBuildExtensionsPath)\Microsoft\M\v1.0</MTargetsPath>
    ...
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="MixbitsValues.m" />
  </ItemGroup>
  <ItemGroup>
    <MReference Include="C:\WixbitsTypes.mx" />
  </ItemGroup>
  <Import Project="$(MTargetsPath)\MProject.targets" />
</Project>

範例程式碼

本文包含範例程式碼會是玩具儲存機制瞭解稍微更完整功能模型描述,我已經已在此討論的 MSI 檔案的安裝程式公用程式 (repinst.exe)。一旦在型別和值,描述 WiX 模型已編譯 (使用 m.exe) 中,並載入存放庫 (使用 mx.exe) 值的資料上執行 repinst.exe 公用程式會從儲存機制中讀取資料,建立 MSI 檔案從它,並允許所有使用者資料庫部署應用程式,因此載入,如 [圖 8 ] 所示的存取權,安裝程式。

fig08.gif

[圖 8 : repinst 動作的範例

我做了一些工作,在這個範例中,大部分重新整理的 exposition,但是大量的工作 (以及在信用 !) 到 Thomas Delrue、 Alejandro Trigo,Giovanni Della-Libera 其工作的模型 WiX,轉譯成 WiX 的 M 」,並產生的 MSI,從 SQL 資料。我無法永遠不會已經撰寫這篇文章在我並沒有基本的中斷工作的時間。而且,感謝至 Josh Williams、 Martin Gudgin 和 John Doty,整個其他範例,來探索,您會看到的存放庫的功能,奧斯陸 「 開發人員中心真正很快就現在。

Chris Sells 是連線系統部門,在 Microsoft 的程式經理,他使用下一個 Gen 應用程式開發技術。Chris 和其相關的詳細資訊可以在找到各種不同的專案sellsbrothers.com.