Share via


網域服務

網域服務為封裝 WCF RIA Services 應用程式商務邏輯的 Windows Communication Foundation (WCF) 服務。網域服務會以服務層的方式公開一組相關的作業。定義網域服務時,您指定透過網域服務允許的資料作業。

指定網域服務時,您應該將網域服務視為您可以期待使用者在您應用程式中執行的一組相關工作。此類工作通常牽涉到一小組緊密相關的實體。例如,在經費支出報表應用程式中,您可以公開支出報告、產品項目和詳細資料的實體。接著,您可以將帳戶和付款的實體放在不同的網域服務中。

網域服務及其資料來源

DomainService 類別為所有做為網域服務之類別的基底類別。若要建立繫結至自訂資料物件的網域服務,您要建立直接衍生自 DomainService 的類別。但是,如果您有一個繫結 ADO.NET 實體模型,或公開指向 SQL 資料庫之連結的網域服務,則會有衍生自您改用之 DomainService 的特殊抽象類別。

  • 若要建立繫結至 ADO.NET 實體模型的網域服務,您要建立一個衍生自 LinqToEntitiesDomainService 的類別。RIA Services 會提供 LinqToEntitiesDomainService 類別。

  • 如果您想要建立一個在應用程式中公開 LINQ to SQL 類別的網域服務,您要建立一個衍生自 LinqToSqlDomainService 的類別。此類別會在 RIA Services 工具組中提供。如果您想要使用此類別建立一個在應用程式中公開 LINQ to SQL 類別的網域服務,您必須下載 RIA Services 工具組。

當您使用 [加入新的 DomainService 類別] 對話方塊來建立網域服務時,所建立之網域服務的類型是以您公開的實體為基礎。

網域服務類別必須以 EnableClientAccessAttribute 屬性加以標記,服務才能供用戶端專案使用。當您選取 [加入新的 DomainService 類別] 對話方塊中的 [啟用用戶端存取] 核取方塊時,EnableClientAccessAttribute 屬性會自動套用至網域服務。在網域服務中套用 EnableClientAccessAttribute 屬性時,RIA Services 會針對用戶端專案產生對應的類別。例如,當您將 EnableClientAccessAttribute 屬性套用到名稱為 HRService 的網域服務,且該網域服務會公開名稱為 Employee 的實體時,RIA Services 會在用戶端專案和用戶端版本的 Employee 實體中,產生名稱為 HRContext 的網域內容。

WCF 和網域服務

網域服務會建置在 WCF 概念之上,做為 Windows Communication Foundation (WCF) 服務。網域服務會保留下列項目:

  • WCF 服務的標準使用方式

  • 現有的 WCF 程式撰寫模型建構,例如作業合約、作業行為和服務行為。

  • 標準 WCF 自訂功能,例如繫結組態、行為組態和管理基礎結構

網域內容會使用 WCFChannelFactory 來建立通道,然後將其傳遞給產生自網域服務的服務合約,藉以與 RIA Services 網域服務進行通訊。

根據預設,系統僅會針對網域服務啟用二進位端點。若要使用二進位端點,不需要其他任何設定。如果您要使用其他端點 (例如 OData、JSON、SOAP 或自訂主機),您必須在 Web.config 檔案中註冊一個嘟點,如下所示:

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

System.ServiceModel.DomainServices.Hosting 命名空間包含 RIA Services 中支援的端點。Microsoft.ServiceModel.DomainServices.Hosting 命名空間包含使用 RIA Services 工具組支援的端點,例如上一個範例中所示的 JsonEndpointFactory。若要建立自訂端點,您必須建立一個衍生自 DomainServiceEndpointFactory 類別的類別,並覆寫 CreateEndpoints 方法。

資料作業

您要將執行您要公開之資料作業的方法加入至網域服務中。例如,您可以加入執行下列作業的方法:

  • Query

  • Update

  • Insert

  • Delete

您也可以加入更複雜的作業,例如:

  • Invoke:實作需要執行,但是不追蹤或延後執行的作業。此方法僅能搭配非實體資料使用,而且只能在無法使用查詢、更新、插入或刪除作業時使用。

  • Named Update:實作不屬於簡單修改作業的自訂作業。

當您公開網域服務時,EntitySet 物件是在網域內容中,與指出用戶端允許之作業 (插入、更新或刪除) 的屬性一起產生。您要修改實體集合,然後呼叫 SubmitChanges 方法來執行資料修改。

在絕大多數情況下,您應該使用查詢作業,而不是叫用作業來載入資料。查詢方法會傳回單一 Entity 物件、IQueryable<Entity> 物件或 IEnumerable<Entity> 物件。查詢方法是中介層上的 DomainService 和用戶端上的 DomainContext 所支援資料模式中不可或缺的一部分。RIA Services 架構只會在用戶端專案中針對從 DomainService 中的查詢方法傳回的實體產生實體。

叫用作業提供一個超出範圍的機制來傳回非實體資料,並執行會產生副作用的作業。如需副作用的詳細資訊,請參閱 HasSideEffects 屬性。叫用作業通常不適合查詢方法。即使叫用作業傳回實體,也只有在實體是由查詢方法傳回時,才會針對用戶端專案產生該實體。

慣例

當您加入方法來執行這些作業時,該方法必須無和該作業預期的簽章。除了符合簽章之外,該方法還必須包含符合該資料作業之命名慣例的名稱前置詞。如果方法的名稱開頭不是預期的前置詞,您必須套用該作業的對應屬性。如果作業的名稱符合命名慣例,則該屬性是選擇性的。使用命名慣例會針對開發人員提供更一致的經驗。

您無法多載屬於網域作業的方法。您必須針對可以從用戶端專案呼叫的每個方法,指定一個唯一的名稱。表示網域服務作業的所有方法都必須是公開的。這些方法必須在參數中使用可序列化型別,並傳回型別。

您可以將 IgnoreAttribute 屬性加入至方法來防止公開方法。

資料作業簽章會在下表中提供。

查詢

查詢方法必須傳回實體的單一執行個體,或者 IEnumerableIQueryable,其中 T 是一個有效的實體型別。由於系統不允許多載方法,因此,您必須針對採用不同輸入參數 (例如 GetEmployees()GetEmployeesByLastName(string lastname) 的每個方法,提供一個唯一的名稱。

下表列出查詢作業的預期簽章值。

傳回值

IEnumerable<T>IQueryable<T> 或實體

參數

任何數目的參數

名稱前置詞

任何名稱

屬性

[Query] (C#)

-或-

<Query()> (Visual Basic)

如需詳細資訊,請參閱 QueryAttribute

範例

public IQueryable<Product> GetProducts() (C#)

-或-

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

更新

下表列出更新作業的預期簽章值。

傳回值

參數

實體

名稱前置詞

更新、變更或修改

屬性

[Update] (C#)

-或-

<Update()> (Visual Basic)

如需詳細資訊,請參閱 UpdateAttribute

範例

public void UpdateProduct(Product product) (C#)

-或-

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

插入

下表列出插入作業的預期簽章值。

傳回值

參數

實體

名稱前置詞

插入、加入或建立

屬性

[Insert] (C#)

-或-

<Insert()> (Visual Basic)

如需詳細資訊,請參閱 InsertAttribute

範例

public void InsertProduct(Product product) (C#)

-或-

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

刪除

下表列出刪除作業的預期簽章值。

傳回值

參數

實體

名稱前置詞

刪除或移除

屬性

[Delete] (C#)

-或-

<Delete()> (Visual Basic)

如需詳細資訊,請參閱 DeleteAttribute

範例

public void DeleteProduct(Product product) (C#)

-或-

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

叫用

叫用作業提供一個超出範圍的機制來傳回非實體資料,並執行會產生副作用的作業。如需副作用的詳細資訊,請參閱 HasSideEffects 屬性。叫用作業通常不適合查詢方法。

下表列出叫用作業的預期簽章值。

傳回值

任何

參數

任何數目的參數

名稱前置詞

任何

屬性

[Invoke] (C#)

-或-

<Invoke> (Visual Basic)

如需詳細資訊,請參閱 InvokeAttribute

範例

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

-或-

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

具名更新

下表列出具名更新作業的預期簽章值。

傳回值

參數

實體

任意數目的其他參數

名稱前置詞

不使用插入、更新或刪除的前置詞做為開頭的任何名稱

屬性

[Update(UsingCustomMethod=true] (C#)

-或-

<Update(UsingCustomMethod:=True)> (Visual Basic)

如需詳細資訊,請參閱 UpdateAttribute

範例

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

-或-

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

將應用程式邏輯加入至網域服務

定義公開的資料作業之後,您可以將所需的應用程式邏輯加入至網域服務類別。由精靈產生的程式碼僅用於協助您開始撰寫應用程式邏輯。您可以將邏輯直接加入到作業方法,或將其加入到從作業方法呼叫的方法。您可以將參數加入到現有的方法、自訂方法的實作,或加入新方法來提供應用程式所需的功能。如需實作商務邏輯的詳細資訊,請參閱 HOW TO:將商務邏輯加入至網域服務

實作網域服務時,您必須仔細考慮透過服務公開資料的安全性風險。如需安全性的詳細資訊,請參閱 WCF RIA Services 的安全性

另請參閱

概念

DomainContext 和作業
WCF RIA Services 的安全性