在调试代码时发现的问题,疑似Bug,所以斗胆放在首页.
描述:Service端的抽象类在客户端可以编译通过.
还有我在Service端加的注释不能在Client端显示,如何为Service端的类添加注释以辅助客户端使用Service呢?
可以說,Known完全是SOA與OO沖突的產物,是個可憐的棄子!
OO要求繼承父類的東西,但SOA不知道是否把繼承的東西Show給Client.最后WCF決定子類不Show給Client.從而導致了繼承和多態在WCF的丟失,為了彌補這個問題,Known Attribute就產生了.
Known標志著子類可被客戶端識別、使用.
可以使用Known的三個地方
一.基類自身
二.特定操作
三.服務契約
詳細信息參見下面的代碼解釋.
【注】
KnownType不可應用于interface
DataContract也不可以
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TestKnown_AX


{
[ServiceContract]
//【服務契約處聲明了A0】
[ServiceKnownType(typeof(A0))]
public interface IKnown_AX

{
[OperationContract]
//【特定操作處聲明A1】
[ServiceKnownType(typeof(A1))]
void DoWork(A a);
}


/**//// <summary>
/// This is a abstract class,Please don't new it.
/// </summary>
[DataContract(Name="A",Namespace="http://AX")]
//【基類自身處聲明A2】
//★★★我沒有在任何地方聲明A3是Known類型★★★
[KnownType(typeof(A2))]
public abstract class A

{

public virtual void OA()
{}
public abstract void OperateA();
}

//不能繼承父類的序列化功能,必須重新聲明
[DataContract]
public class A0 : A

{

void OperateA0()
{ }

public override void OperateA()
{ }
}

[DataContract]
public class A1 : A

{

void OperateA1()
{ }

public override void OperateA()
{ }

new void OA()
{ }
}

//如果把[DataContract]契約注釋掉服務將不能啟動,報錯
//因為前面已經聲明該類為Known,必須為可序列化
[DataContract]
public class A2 : A

{

void OperateA2()
{ }

public override void OperateA()
{ }
}

//即使加了[DataContract],客戶端也不會知道它的存在
[DataContract]
public class A3 : A

{

void OperateA3()
{ }

public override void OperateA()
{ }
}
}

客戶端(SR為引用服務的名稱)
namespace Test_AX


{
public partial class _Default : System.Web.UI.Page

{
protected void Page_Load(object sender, EventArgs e)

{
SR.IKnown_AX proxy = new SR.Known_AXClient();
proxy.DoWork(new Test_AX.SR.A0());
proxy.DoWork(new Test_AX.SR.A1());
proxy.DoWork(new Test_AX.SR.A2());
//不認識A3類
//proxy.DoWork(new Test_AX.SR.A3());
//是的,你沒看錯【抽象類A】被new了,但編譯不報錯
//但運行時會報錯
proxy.DoWork(new Test_AX.SR.A());
//因為B在項目內,所以編譯會報錯
//B b = new B();
}
}

public abstract class B

{
}
}
Demo下载
博客园→斧头帮少帮主
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架