西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)其它知識(shí) → WCF服務(wù)編程中使用SvcMap實(shí)現(xiàn)類型共享等技巧

WCF服務(wù)編程中使用SvcMap實(shí)現(xiàn)類型共享等技巧

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/1/18 8:38:07字體大。A-A+

作者:西西點(diǎn)擊:1次評(píng)論:0次標(biāo)簽: WCF

  • 類型:源碼相關(guān)大小:79KB語言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

調(diào)用過WCF服務(wù)的同學(xué)可能都會(huì)遇到這樣的問題,同一個(gè)實(shí)體類型,不同的服務(wù)Visual Studio生成了不同的版本,例如Service1.User和Service2.User,對(duì)于C#來說,這是兩個(gè)不同的類型,Service1獲得的User是放不到Service2服務(wù)里去的。手動(dòng)的屬性賦值來轉(zhuǎn)換顯然是不可取的,所以就共享類型了。

方法一、服務(wù)端和客戶端共享數(shù)據(jù)契約程序集

這個(gè)方法最常用,也是大家最熟悉的方法,把WCF的數(shù)據(jù)契約放在一個(gè)獨(dú)立類庫里,服務(wù)端,客戶端都引用這個(gè)程序集,然后在生成WCF時(shí),選擇重新使用引用程序集中的類型即可。

這個(gè)方法缺點(diǎn)很明顯,它只有在客戶端和服務(wù)端在同一個(gè)Visual Studio解決方案內(nèi)才方便,否則要不斷手動(dòng)更新數(shù)據(jù)契約程序集。更不用說是第三方的服務(wù)。

方法二,暴力轉(zhuǎn)換類型

這個(gè)其實(shí)不是類型共享,不過也是解決這個(gè)問題的一種手段。就是借助AutoMapper,EmitMapper這樣的類庫幫助快速轉(zhuǎn)換類型。下面是一個(gè)例子。

Money類型包含User實(shí)體和Currency枚舉和一個(gè)數(shù)字的Amount,Money的定義

[DataContract(Namespace = Consts.Namespace)]
public class Money
{
    [DataMember]
    public decimal Amount { get; set; }

    [DataMember]
    public Currency Currency { get; set; }

    [DataMember]
    public UserInfo User { get; set; }
}

Currency:

[DataContract(Namespace = Consts.Namespace)]
public enum Currency
{
    [EnumMember]
    Euro,
    [EnumMember]
    Usd,
    [EnumMember]
    PoundSterling
}

UserInfo:

[DataContract(Namespace = Consts.Namespace)]
public class UserInfo
{
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
    [DataMember]
    public string Email { get; set; }
    [DataMember]
    public string Phone { get; set; }
    [DataMember]
    public string Id { get; set; }
}

對(duì)于DepositServiceNoSharp和WithdrawalServiceNoSharp這兩個(gè)WCF服務(wù)版本的Money和User,可以這樣添加一些擴(kuò)展方法

using AutoMapper;
using DepositService = Client.DepositServiceNoSharp;
using Client.WithdrawalServiceNoSharp;

namespace Client
{
    public static class Extensions
    {
        static Extensions()
        {
            Mapper.CreateMap<DepositService.Money, Money>();
            Mapper.CreateMap<Money, DepositService.Money>();
            Mapper.CreateMap<DepositService.UserInfo, UserInfo>();
            Mapper.CreateMap<UserInfo, DepositService.UserInfo>();
        }

        public static Money ToWithdrawal(this DepositService.Money money)
        {
            return Mapper.Map<DepositService.Money, Money>(money);
        }

        public static DepositService.Money ToDeposit(this Money money)
        {
            return Mapper.Map<Money, DepositService.Money>(money);
        }
    }
}

然后就可以輕松轉(zhuǎn)換

var money = new Money
{
    Amount = 1,
    Currency = Currency.Usd,
    User = new UserInfo
    {
        Email = "zhww@outlook.com",
        FirstName = "zhang",
        Id = "123",
        LastName = "weiwen",
        Phone = "110"
    }
};
var depositMoney = money.ToDeposit();

方法三、使用SvcMap實(shí)現(xiàn)類型共享

其實(shí)這個(gè)才是文章的重點(diǎn),前面可以忽略。

生成第一個(gè)WCF服務(wù)后,點(diǎn)擊”顯示所有文件“去編輯SvcMap文件:

找到MetadataSources節(jié)點(diǎn),原來只有一個(gè),現(xiàn)在把其他要引用的服務(wù)添加到這里,例如:

  <MetadataSources>
    <MetadataSource Address="http://localhost:34875/DepositService.svc" Protocol="http" SourceId="1" />
    <MetadataSource Address="http://localhost:34875/WithdrawalService.svc" Protocol="http" SourceId="2" />
  </MetadataSources>

再右擊服務(wù),”更新服務(wù)引用“,所有服務(wù)都會(huì)生成到同一個(gè)命名空間里,實(shí)現(xiàn)類型共享。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)
    推薦文章

    沒有數(shù)據(jù)