|
【1】重載概念:
【1.1】什么是重載(OverLoad):
所謂重載是指同一個(gè)方法名可以對(duì)應(yīng)著多個(gè)方法的實(shí)現(xiàn)。這些方法的名字相同,但是方法的參數(shù)的類(lèi)型不同。這就是方法重載的概念。函數(shù)方法類(lèi)和對(duì)象的應(yīng)用尤其重要。
方法重載要求編譯器能夠唯一地確定調(diào)用一個(gè)方法時(shí)應(yīng)執(zhí)行哪個(gè)方法代碼,即采用哪個(gè)方法實(shí)現(xiàn)。確定方法實(shí)現(xiàn)時(shí),要求從方法參數(shù)的個(gè)數(shù)和類(lèi)型上來(lái)區(qū)分。這就是說(shuō),進(jìn)行方法重載時(shí),要求同名方法在參數(shù)個(gè)數(shù)上不同,或者參數(shù)類(lèi)型上不同。否則,將無(wú)法實(shí)現(xiàn)重載。
關(guān)于重載一定要注意:重載方法的參數(shù)類(lèi)型和參數(shù)個(gè)數(shù)一定要不同(即:要么參數(shù)的類(lèi)型不同,要么參數(shù)的個(gè)數(shù)不同,要么參數(shù)的類(lèi)型和個(gè)數(shù)都不同),否則,編譯器就不知道該調(diào)用那個(gè)方法了。
方法重載的好處就是相同的方法,帶來(lái)不同的結(jié)果和實(shí)現(xiàn),這里我們可以根據(jù)傳遞參數(shù)的不同來(lái)決定調(diào)用的方法。這是編譯時(shí)多態(tài)的一種實(shí)現(xiàn)機(jī)制。
【1.2】C#類(lèi)方法重載示例:
我們這里給出一個(gè)簡(jiǎn)單的c#語(yǔ)言實(shí)現(xiàn)的方法重載的列子,這里對(duì)于SayHelloOverLoading方法,同一個(gè)類(lèi)里給出的三個(gè)方法的參數(shù)個(gè)數(shù)不同。內(nèi)部實(shí)現(xiàn)也不同。具體代碼如下:
//3.面向?qū)ο罄锏念?lèi),如何實(shí)現(xiàn)操作重載,和WCF服務(wù)類(lèi)里的操作重載做對(duì)比public class ClassOverLoading
{
public ClassOverLoading()
{
}
//掩飾方法重載,分別實(shí)現(xiàn)三個(gè)方法,C#等面向?qū)ο蟮恼Z(yǔ)言提供了方法重載機(jī)制的支持。
public string SayHelloOverLoading()
{
//編寫(xiě)代碼
return "Hello,This an C# class overloading demo";
}
//類(lèi)里的方法重載不需要?jiǎng)e名
public string SayHelloOverLoading(string name)
{
//編寫(xiě)代碼
return "Hello:" + name + "This an C# class overloading demo";
}
public string SayHelloOverLoading(string firstName, string lastName)
{
//編寫(xiě)代碼
return "Hello:" + firstName + lastName + "This an C# class overloading demo";
}
}
【2】操作重載:
【2.1】操作重載:
WCF服務(wù)支持核心的Web 服務(wù)協(xié)議,同樣其元數(shù)據(jù)交換也是基于XML語(yǔ)言描述,客戶端通過(guò)WSDL文件來(lái)了解服務(wù)方法相關(guān)的信息,包括參數(shù)的個(gè)數(shù)、類(lèi)型、返回值、調(diào)用順序等重要信息。由于WSDL不支持方法的重載,因此我們的WCF服務(wù)操作重載就無(wú)法通過(guò)WSDL暴露給客戶端。如果我們?cè)诜?wù)契約里定義了方法的重載,編譯可以正常通過(guò),但是啟動(dòng)服務(wù)宿主就會(huì)拋出System.InvalidOperationException異常,如下圖:
因此我們不能在WCF服務(wù)內(nèi)定義和實(shí)現(xiàn)方法重載,否則無(wú)法暴露為服務(wù)操作。
【2.2】解決辦法:
WCF給我們提供了一個(gè)解決辦法,讓我們可以在WCF服務(wù)類(lèi)里使用服務(wù)操作的重載。WCF定義了一個(gè)機(jī)制OperationContract,使用OperationContract特性的Name屬性,為操作指定別名:
[AttributeUsage(AttributeTargets.Method)]public sealed class OperationContractAttribute : Attribute
{
public string Name
{get;set;}
//更多成員
}
【3】代碼實(shí)現(xiàn)分析:
下面我們來(lái)給出一個(gè)具體的WCF服務(wù)實(shí)現(xiàn)操作重載,包括服務(wù)定義、宿主配置、客戶端引用和測(cè)試的完整過(guò)程。
【3.1】服務(wù)契約:
定義了服務(wù)契約IWCFOverLoadingService,分別給出SayHelloOverLoading操作契約的3種不同定義和WCFService服務(wù)類(lèi)里的實(shí)現(xiàn)。具體代碼如下:
//1.服務(wù)契約,操作契約重載[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFOverLoadingService
{
//操作契約
[OperationContract(Name = "SayHelloOverLoading1")]
string SayHelloOverLoading();
//操作契約
[OperationContract(Name = "SayHelloOverLoading2")]
string SayHelloOverLoading(string name);
//操作契約
[OperationContract(Name = "SayHelloOverLoading3")]
string SayHelloOverLoading(string firstName, string lastName);
}
//2.服務(wù)類(lèi),集成接口。實(shí)現(xiàn)契約
public class WCFService : IWCFOverLoadingService
{
//實(shí)現(xiàn)接口定義的方法
public string SayHelloOverLoading()
{
Console.WriteLine("Hello! ,This an overloading demo for WCF Service

return "Hello! This an overloading demo for WCF Service

}
//實(shí)現(xiàn)接口定義的方法
public string SayHelloOverLoading(string name)
{
Console.WriteLine("Hello! {0},This an overloading demo WCF Service

return "Hello! " + name + ", This an overloading demo for WCF Service

}
//實(shí)現(xiàn)接口定義的方法
public string SayHelloOverLoading(string firstName, string lastName)
{
Console.WriteLine("Hello! {0} {1},This an overloading demo WCF Service

return "Hello! " + firstName + " " + lastName + ", This an overloading demo for WCF Service

}
}
【4】運(yùn)行結(jié)果:
這里分別調(diào)用三種服務(wù)操作,進(jìn)行測(cè)試。運(yùn)行的結(jié)果如圖所示:
【5】總結(jié):
以上就是本節(jié)對(duì)WCF服務(wù)操作重載的介紹,包括一般重載的基本定義和c#語(yǔ)言中簡(jiǎn)單的方法重載的實(shí)現(xiàn)。然后介紹了WCF操作重載的實(shí)現(xiàn)機(jī)制、局限性和解決辦法,服務(wù)契約默認(rèn)不支持操作方法重載,我們可以利用WCF已有的機(jī)制給出方法的別名來(lái)解決這個(gè)問(wèn)題。然后給出了包括客戶端等完整的測(cè)試解決方案,客戶端反序列話生成服務(wù)類(lèi)默認(rèn)不支持服務(wù)操作方法重載的,生成的也是服務(wù)操作的別名方法。我們?cè)诳蛻舳艘胧狗?wù)代理類(lèi)支持重載,以利用重載的優(yōu)勢(shì),就需要重新修改客戶端服務(wù)代理代碼。 另外給出本節(jié)的實(shí)例代碼供大家參考:
繼上一節(jié)WCF分布式開(kāi)發(fā)步步為贏系列的(4):WCF服務(wù)可靠性傳輸配置與編程開(kāi)發(fā),本節(jié)我們繼續(xù)學(xué)習(xí)WCF分布式開(kāi)發(fā)步步為贏的第(5)節(jié):服務(wù)契約與操作重載。這里我們首先講解OOP面向?qū)ο蟮木幊讨蟹椒ㄖ剌d,重載的意義,WCF服務(wù)編程開(kāi)發(fā)如何實(shí)現(xiàn)操作重載,隨后是代碼分析部分,給出了服務(wù)端服務(wù)契約定義和實(shí)現(xiàn)操作重載的注意的問(wèn)題和實(shí)現(xiàn)過(guò)程,然后詳細(xì)介紹了客戶端實(shí)現(xiàn)操作重載的方式。
NET技術(shù):WCF分布式開(kāi)發(fā)步步為贏(5)服務(wù)契約與操作重載,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。