惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - 叶小钗
The Cloudflare Blog
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
小众软件
小众软件
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享

博客园 - 斧头帮少帮主

猜一猜,会输出什么? ASP.NET错误处理的两种方案_AX Log4Net最简单的使用配置_AX 一个修改后的JS日历(Calendar)控件_AX - 斧头帮少帮主 - 博客园 页面回传(PostBack)后恢复滚动条的位置_AX - 斧头帮少帮主 - 博客园 Hidden Field 的值不能回传(PostBack)到后台_AX Delegate(代理)异常:该委托必须有一个目标 WCF学习随笔6--Version变更--我们在前进_AX WCF学习随笔4--契约|序列化详解--祭斧_AX WCF学习随笔3--第一个Sample--祭斧_AX - 斧头帮少帮主 - 博客园 WCF学习随笔2--Contract--磨斧_AX WCF学习随笔1--扫盲--磨斧_AX 把项目运行情况写入系统日志(Log)的三种方法【续】_AX 把项目运行情况写入系统日志(Log)的三种方法_AX 为用户控件User Control添加事件_AX XML常用操作总结_AX DataTable常用操作总结_AX - 斧头帮少帮主 - 博客园 .NET(C#)代码性能优化_AX - 斧头帮少帮主 - 博客园 Panel的不足及弥补_AX - 斧头帮少帮主 - 博客园
WCF学习随笔5--我知道:Known--可憐的孩子_AX
斧头帮少帮主 · 2008-03-19 · via 博客园 - 斧头帮少帮主

在调试代码时发现的问题,疑似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下载

博客园斧头帮少帮主

少帮主的斧头好久不饮血了!

posted on 2008-03-19 17:23  斧头帮少帮主  阅读(2121)  评论()    收藏  举报