WCF學習隨筆5–我知道:Known–可憐的孩子_AX

來源:互聯網
上載者:User

在調試代碼時發現的問題,疑似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下載

部落格園→斧頭幫少幫主

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.