首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

DinnerNow 架構實戰(1):WCF 服務與首頁資料載入流程深度解析

     編輯:關於.NET

專案結構雙解決方案架構

  • DinnerNow - Web.sln:前端 Web 應用
    • DinnerNow.WebUX:UI 邏輯、WCF Client Proxy、AJAX 頁面
    • DinnerNow.Web:基礎變數定義
    • Microsoft.DPE.Samples.CardSpace:CardSpace 整合
  • DinnerNow - ServicePortfolio2.sln:後端服務層
    • DinnerNow.ServiceHost:WCF 服務裝載站點
    • DinnerNow.Services:服務契約與實作(IMenuSearchService, MenuSearchService)
    • DinnerNow.Business:業務邏輯與 LINQ to SQL 資料存取

首頁資料載入:搜尋條件下拉選單

SearchBar.ascx 使用 ObjectDataSource 綁定兩個下拉選單:

<asp:ObjectDataSource ID="RestaurantCategoryDataSource" TypeName="DinnerNow.RestaurantCategoryDataSource" SelectMethod="SelectAll" />
<asp:DropDownList DataSourceID="RestaurantCategoryDataSource" DataTextField="Description" DataValueField="RestaurantId" />

<asp:ObjectDataSource ID="MenuTypeDataSource" TypeName="DinnerNow.MenuTypeDataSource" SelectMethod="SelectAll" />
<asp:DropDownList DataSourceID="MenuTypeDataSource" DataTextField="MenuTypeName" DataValueField="MenuTypeName" />

DataSource 類別:WCF Client Proxy 呼叫

// DinnerNow.WebUX\Code\DataSources\MenuTypeDataSource.cs
public IEnumerable<RestaurantCategory> SelectAll() {
    try {
        using (var client = new MenuSearchServiceClient("WSHttpBinding_IMenuSearchService")) {
            return client.GetRestaurantCategories();
        }
    } catch { return null; }
}

Web.config 客戶端端點配置

<endpoint address="https://localhost/DinnerNow/service/MenuSearch.svc"
    binding="wsHttpBinding"
    bindingConfiguration="WSHttpBinding_IMenuSearchService"
    contract="MenuSearchService.IMenuSearchService"
    name="WSHttpBinding_IMenuSearchService">
  <identity><servicePrincipalName value="host" /></identity>
</endpoint>

服務端實作:MenuSearch.svc

ServiceHost 專案 web.config 服務定義:

<service behaviorConfiguration="DinnerNow.Services.MenuSearchServiceBehavior" name="DinnerNow.Services.MenuSearchService">
  <endpoint address="" binding="wsHttpBinding" contract="DinnerNow.Services.IMenuSearchService" />
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  <endpoint address="ajax" behaviorConfiguration="DinnerNow.Services.MenuSearchServiceAjax" binding="webHttpBinding" bindingConfiguration="AjaxBinding" contract="DinnerNow.Services.IMenuSearchService" />
</service>

服務契約:

[ServiceContract(Namespace = "DinnerNow.Services")]
public interface IMenuSearchService {
    [OperationContract][WebGet] IEnumerable<MenuType> GetMenuTypes();
    [OperationContract][WebGet] IEnumerable<RestaurantCategory> GetRestaurantCategories();
    [OperationContract][WebGet] IEnumerable<RestaurantHeader> FindRestaurant(string postalCode, string menuType, string restaurantCategoryId, string deadline);
    [OperationContract][WebGet] IEnumerable<RestaurantMenuItem> GetMenuItemsForMenu(string restaurantId, string menuType);
}

服務實作:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MenuSearchService : IMenuSearchService {
    public IEnumerable<Business.Data.MenuType> GetMenuTypes() {
        return new DinnerNow.Business.Menu().GetMenuTypes();
    }
    public IEnumerable<Business.Data.RestaurantCategory> GetRestaurantCategories() {
        return new DinnerNow.Business.Menu().GetRestaurantCategories();
    }
    public IEnumerable<Business.Data.RestaurantHeader> FindRestaurant(string postalCode, string menuType, string restaurantCategoryId, string deadline) {
        return new DinnerNow.Business.Menu().FindRestaurant(postalCode, menuType, new Guid(restaurantCategoryId), int.Parse(deadline));
    }
    public IEnumerable<Business.Data.RestaurantMenuItem> GetMenuItemsForMenu(string restaurantId, string menuType) {
        return new DinnerNow.Business.Menu().GetMenuItemsForMenu(new Guid(restaurantId), menuType);
    }
}

業務邏輯層:LINQ to SQL 資料存取

// DinnerNow.Business\Menu.cs
public IEnumerable<Business.Data.MenuType> GetMenuTypes() {
    var q = from m in db.Menus
            select new Business.Data.MenuType { MenuTypeName = m.MenuType.Trim() };
    return q.Distinct().ToList();
}

public IEnumerable<Business.Data.RestaurantCategory> GetRestaurantCategories() {
    // 類似查詢餐廳分類
}

生成 SQL:SELECT DISTINCT LTRIM(RTRIM(MenuType)) FROM Menu

架構分層優勢

層級專案職責技術
資料存取DinnerNow.BusinessLINQ to SQL 查詢、實體映射LINQ to SQL
業務邏輯DinnerNow.Services服務實作、DTO 轉換WCF
服務裝載DinnerNow.ServiceHost端點、綁定、行為配置WCF 配置
表現層DinnerNow.WebUXUI 綁定、AJAX 呼叫、WCF ClientASP.NET AJAX, WCF Client

清晰分離關注點:資料存取可獨立單元測試、服務可多端點暴露(WS-HTTP、AJAX/JSON)、前端專注體驗優化。

總結

DinnerNow 首頁資料載入展示了經典的「AJAX → WCF → LINQ to SQL」三層呼叫鏈。ObjectDataSource 綁定 DataSource 類別,透過 WCF Client Proxy 呼叫服務,服務委派給 Business 層 LINQ 查詢。這種架構支援團隊平行開發:DBA 優化 SQL、後端實作服務契約、前端設計互動體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved