既然是小孩系列,當然要有一點基礎才能快速掌握,歸納,總結的一個系列,哈哈
前言:
第一篇嘛,不細講,步步教你創建一個簡單SOA案例,對WCF有個基本的認識,我不會細講概念
1.1 SOA簡介
SOA(Service-Oriented Architecture,面向服務架構),既是一種編程模式,也是軟件開發的一種架構方法。
根據這種架構方法,應用程序就會由“具有一定行為(服務)的功能”單元組成的。<如果你寫過WebService,你就會更好理解了,如果你以前用三層形式寫,那么原來的數據訪問層,你只能供你本程序中的程序調用,假如你用了這種架構,例如,根據一個ISBN查詢到對應書的價格,本來是一個方法,如果你用這個架構,這個方法(行為)就會變成一種服務,這個服務綁定到一個url地址上,然后你根據這個url加個特殊的參數(例如ISBN)就可以返回一個json或者xml,然后你就可以調用了,那么例如你的andriod平板,ipad,只要可以通過url就可以獲得你想要的數據,就可以達到跨平台的效果,跟WebService很像,但是WCF完全不會是那么簡單的>
1.2 基本開始
前言:
我們准備完成一個簡單的新聞發布系統
內部編輯發布新聞有更多的功能,但是外部我只提供查看功能,添加自己的新的新聞,但是新聞類型是 好友提供
可能由於我們的新聞系統比較好,我們提供一些接口,讓別人自己做自己的客戶端,也能實現發布新聞,但是我們的源代碼不可能給人家的,所以我們就可以用WCF去做了,再比如,我們想做個iphone應用,別人下載我們的應用也可以查看我們發布的新聞,我們不可能在蘋果手機上去訪問數據庫,我們通過服務去更新數據,中間可以利用WCF實現跨平台,現在我們開始做吧
Contract是契約的意思,最常見的,務必背誦
1.打開Visual Studio 2010,新建一個空白的解決方案
命名NewsSystem,點擊確定
然后右擊解決方案,添加4個解決方案文件夾
Clients,Hosts,Services,Interfaces
2.右擊Interfaces,添加2個類庫
NewsInterface
NewsExternalInterface
添加WCF中最重要的兩個程序集引用
同樣的操作對NewsExternalInterface類庫也操作下
3. 刪除默認添加的兩個Class1.cs文件,分別對應向兩個類庫添加INewsInterface,INewsExternalInterface
4.向兩個接口,都添加下面命名空間引用
using System.Runtime.Serialization;
using System.ServiceModel;
5.interface前面加上 public關鍵字
例如:
6.實體類,我們就不分開寫了,直接寫在對應的接口里面吧,這里只是演示WCF的使用,數據庫操作,直接使用linq to sql了,企業里大部分用EF code first,關於這個以后有時間再講。為了不與數據庫的表明沖突,后面加一個Dto了
主要提前領略一下 操作契約,數據契約,枚舉的使用
我們先操作NewsInterface類庫
6.1新建一個枚舉,NewsTypeEnum,演示枚舉的基本寫法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace NewsInterface
{[DataContract]public enum NewsTypeEnum{[EnumMember]Sports,[EnumMember]IT,[EnumMember]Country,[EnumMember]Funny}}NewsTypeEnum是一個公開的枚舉類型,注意,enum前必須加上DataContract特性,枚舉類型每個常量都必須使用EnumMember特性來表示
6.2 添加一個NewsDto實體類, 演示實體的基本寫法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace NewsInterface
{[DataContract]public class NewsDto{/// <summary>
/// 新聞標題
/// </summary>
[DataMember]public string NewsTitle { get; set; }/// <summary>
/// 新聞內容
/// </summary>
[DataMember]public string Content { get; set; }/// <summary>
/// 新聞類型,這里順便演示下枚舉
/// </summary>
[DataMember]public NewsTypeEnum NewsType { get; set; }
/// <summary>
/// 發布時間
/// </summary>
[DataMember]public DateTime publishTime { get; set; }
/// <summary>
/// 最后更新時間
/// </summary>
[DataMember]public DateTime LastUpdateTime { get; set; }
/// <summary>
/// 作者
/// </summary>
[DataMember]public string Author { get; set; }/// <summary>
/// 最后修改作者
/// </summary>
[DataMember]public string LastAuthor { get; set; }/// <summary>
/// 閱讀量
/// </summary>
[DataMember]public int ReadCount { get; set; }}}
6.3 打開INewsInterface,添加公開方法,演示 普通的接口,這里在WCF中專業名叫數據契約
我們只演示基本的簡單的更刪改查,還有個顯示新聞關聯圖片5個方法,再次聲明,我不講新聞發布的新聞邏輯,這里只是演示WCF的用法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace NewsInterface
{[ServiceContract]public interface INewsInterface{/// <summary>
/// 添加一條新聞
/// </summary>
/// <param name="dto">新聞實體</param>
/// <returns>添加成功后返回添加成功后的ID</returns>
[OperationContract]int NewsAdd(NewsDto dto);
/// <summary>
/// 刪除一條新聞
/// </summary>
/// <param name="dto">新聞實體</param>
/// <returns>是否刪除成功</returns>
[OperationContract]bool NewsDelete(NewsDto dto);
/// <summary>
/// 更新一條新聞
/// </summary>
/// <param name="dto">新聞實體</param>
/// <returns>是否更新成功</returns>
[OperationContract]bool NewsUpdate(NewsDto dto);
/// <summary>
/// 獲得所有新聞
/// </summary>
/// <returns>返回新聞列表</returns>
[OperationContract]List<NewsDto> NewsList();/// <summary>
/// 根據ID獲得新聞的圖片
/// </summary>
/// <param name="Id">新聞編號</param>
/// <returns>新聞相關聯的圖片</returns>
[OperationContract]byte[] GetNewsImage(string Id);}}
7.創建服務
右擊 Services解決方案文件夾,添加一個類庫,名字叫NewsServices
將Class1.cs文件名改下
7.1 先編譯解決方案,然后 添加引用
7.2 實現接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsInterface;
namespace NewsServices
{public class NewsImpl:INewsInterface{public int NewsAdd(NewsDto dto){throw new NotImplementedException();}public bool NewsDelete(NewsDto dto){throw new NotImplementedException();}public bool NewsUpdate(NewsDto dto){throw new NotImplementedException();}public List<NewsDto> NewsList()
{throw new NotImplementedException();}public byte[] GetNewsImage(string Id){throw new NotImplementedException();}}}
8. 添加宿主Hosts文件夾下,我們以控制台演示,宿主可以是很多種形式的,具體以后講
同時修改屬性 用.NET Framework4
然后添加引用
打開Program.cs填入一下基本代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsServices;
namespace NewsHosts
{class Program
{static void Main(string[] args){Console.WriteLine("服務宿主正在打開...");
try
{//ToDo 等待開啟服務代碼
}catch (Exception ex)
{Console.WriteLine(ex.Message);}Console.WriteLine("打開成功!");
Console.ReadKey();}}}
使用ServiceHost對象,添加Program類中
在try…catch代碼塊中添加如下代碼:
添加宿主服務配置,我們利用WCF工具配置,也可以手動寫
默認生成的App.config右擊它,沒有使用WCF工具配置,我們打開
vs2010菜單欄中的 WCF服務配置編輯器
使用之前,請確保你的解決方案重新生成了
下面我錄個屏,講一下配置
這里注意記住終結點這個地址,通過這個地址,我們的其他客戶端,就可以獲得我們想要的數據,我們可以直接把數據發在這個地址上,返回JSON或者XML,或者是.NET對象,然后你繼續處理,如果JSON或者XML,那么WEB就可以使用$.ajax等jQuery的方法獲得數據了,用於顯示在網頁上了
設置啟動項,運行
先把服務能啟動成功!
代碼下載: 點我下載
明天2013年6月28日主要講
9.創建數據庫
10. 創建服務
11.客戶端使用服務,實現更刪改查,顯示圖片
時間真的不早了,我要睡覺了。一點一點寫吧
晚安,大家!