在调试代码时发现的问题,疑似Bug,所以斗胆放在首页.
描述:Service端的抽象类在客户端可以编译通过.
还有我在Service端加的注释不能在Client端显示,如何为Service端的类添加注释以辅助客户端使用Service呢?
可以說,Known完全是SOA與OO沖突的產物,是個可憐的棄子!OO要求繼承父類的東西,但SOA不知道是否把繼承的東西Show給Client.最后WCF決定子類不Show給Client.從而導致了繼承和多態在WCF的丟失,為了彌補這個問題,Known Attribute就產生了.
Known標志著子類可被客戶端識別、使用.
可以使用Known的三個地方
一.基類自身
二.特定操作
三.服務契約
詳細信息參見下面的代碼解釋.
【注】
KnownType不可應用于interface
DataContract也不可以
[img]/Images/OutliningIndicators/None.gif[/img]using System;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Collections.Generic;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Linq;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Runtime.Serialization;
[img]/Images/OutliningIndicators/None.gif[/img]using System.ServiceModel;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Text;
[img]/Images/OutliningIndicators/None.gif[/img]
[img]/Images/OutliningIndicators/None.gif[/img]namespace TestKnown_AX
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]
{
[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【服務契約處聲明了A0】
[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceKnownType(typeof(A0))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
interface IKnown_AX
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/InBlock.gif[/img] [OperationContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【特定操作處聲明A1】
[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceKnownType(typeof(A1))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] void DoWork(A a);
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] /**////
<summary>
[img]/Images/OutliningIndicators/InBlock.gif[/img] /// This is a abstract class,Please don't new it.
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] ///
</summary>
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract(Name="A",Namespace="http://AX")]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【基類自身處聲明A2】
[img]/Images/OutliningIndicators/InBlock.gif[/img] //★★★我沒有在任何地方聲明A3是Known類型★★★
[img]/Images/OutliningIndicators/InBlock.gif[/img] [KnownType(typeof(A2))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
class A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
virtual
void OA()
{}
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
void OperateA();
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //不能繼承父類的序列化功能,必須重新聲明
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A0 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA0()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A1 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA1()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] new
void OA()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //如果把[DataContract]契約注釋掉服務將不能啟動,報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //因為前面已經聲明該類為Known,必須為可序列化
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A2 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA2()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //即使加了[DataContract],客戶端也不會知道它的存在
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A3 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA3()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}
[img]/Images/OutliningIndicators/None.gif[/img]
客戶端(SR為引用服務的名稱)
[img]/Images/OutliningIndicators/None.gif[/img]namespace Test_AX
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]
{
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
partial
class _Default : System.Web.UI.Page
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/InBlock.gif[/img] protected
void Page_Load(object sender, EventArgs e)
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/InBlock.gif[/img] SR.IKnown_AX proxy =
new SR.Known_AXClient();
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A0());
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A1());
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A2());
[img]/Images/OutliningIndicators/InBlock.gif[/img] //不認識A3類
[img]/Images/OutliningIndicators/InBlock.gif[/img] //proxy.DoWork(new Test_AX.SR.A3());
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //是的,你沒看錯【抽象類A】被new了,但編譯不報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //但運行時會報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A());
[img]/Images/OutliningIndicators/InBlock.gif[/img] //因為B在項目內,所以編譯會報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //B b = new B();
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
class B
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}
Demo下载
描述:Service端的抽象类在客户端可以编译通过.
还有我在Service端加的注释不能在Client端显示,如何为Service端的类添加注释以辅助客户端使用Service呢?
可以說,Known完全是SOA與OO沖突的產物,是個可憐的棄子!OO要求繼承父類的東西,但SOA不知道是否把繼承的東西Show給Client.最后WCF決定子類不Show給Client.從而導致了繼承和多態在WCF的丟失,為了彌補這個問題,Known Attribute就產生了.
Known標志著子類可被客戶端識別、使用.
可以使用Known的三個地方
一.基類自身
二.特定操作
三.服務契約
詳細信息參見下面的代碼解釋.
【注】
KnownType不可應用于interface
DataContract也不可以
[img]/Images/OutliningIndicators/None.gif[/img]using System;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Collections.Generic;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Linq;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Runtime.Serialization;
[img]/Images/OutliningIndicators/None.gif[/img]using System.ServiceModel;
[img]/Images/OutliningIndicators/None.gif[/img]using System.Text;
[img]/Images/OutliningIndicators/None.gif[/img]
[img]/Images/OutliningIndicators/None.gif[/img]namespace TestKnown_AX
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]
{[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【服務契約處聲明了A0】
[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceKnownType(typeof(A0))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
interface IKnown_AX
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/InBlock.gif[/img] [OperationContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【特定操作處聲明A1】
[img]/Images/OutliningIndicators/InBlock.gif[/img] [ServiceKnownType(typeof(A1))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] void DoWork(A a);
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] /**////
<summary>
[img]/Images/OutliningIndicators/InBlock.gif[/img] /// This is a abstract class,Please don't new it.
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] ///
</summary>
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract(Name="A",Namespace="http://AX")]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //【基類自身處聲明A2】
[img]/Images/OutliningIndicators/InBlock.gif[/img] //★★★我沒有在任何地方聲明A3是Known類型★★★
[img]/Images/OutliningIndicators/InBlock.gif[/img] [KnownType(typeof(A2))]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
class A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
virtual
void OA()
{}[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
void OperateA();
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //不能繼承父類的序列化功能,必須重新聲明
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A0 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA0()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A1 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA1()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] new
void OA()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //如果把[DataContract]契約注釋掉服務將不能啟動,報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //因為前面已經聲明該類為Known,必須為可序列化
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A2 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA2()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //即使加了[DataContract],客戶端也不會知道它的存在
[img]/Images/OutliningIndicators/InBlock.gif[/img] [DataContract]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
class A3 : A
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] void OperateA3()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img] public
override
void OperateA()
{ }[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}
[img]/Images/OutliningIndicators/None.gif[/img]
客戶端(SR為引用服務的名稱)
[img]/Images/OutliningIndicators/None.gif[/img]namespace Test_AX
[img]/Images/OutliningIndicators/ExpandedBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedBlock.gif[/img]
{[img]/Images/OutliningIndicators/InBlock.gif[/img] public
partial
class _Default : System.Web.UI.Page
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/InBlock.gif[/img] protected
void Page_Load(object sender, EventArgs e)
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/InBlock.gif[/img] SR.IKnown_AX proxy =
new SR.Known_AXClient();
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A0());
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A1());
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A2());
[img]/Images/OutliningIndicators/InBlock.gif[/img] //不認識A3類
[img]/Images/OutliningIndicators/InBlock.gif[/img] //proxy.DoWork(new Test_AX.SR.A3());
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] //是的,你沒看錯【抽象類A】被new了,但編譯不報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //但運行時會報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] proxy.DoWork(new Test_AX.SR.A());
[img]/Images/OutliningIndicators/InBlock.gif[/img] //因為B在項目內,所以編譯會報錯
[img]/Images/OutliningIndicators/InBlock.gif[/img] //B b = new B();
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/InBlock.gif[/img]
[img]/Images/OutliningIndicators/InBlock.gif[/img] public
abstract
class B
[img]/Images/OutliningIndicators/ExpandedSubBlockStart.gif[/img][img]/Images/OutliningIndicators/ContractedSubBlock.gif[/img]
{[img]/Images/OutliningIndicators/ExpandedSubBlockEnd.gif[/img] }
[img]/Images/OutliningIndicators/ExpandedBlockEnd.gif[/img]}
Demo下载

添加至收藏夹