日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

WCF類型共享技巧

 昵稱10504424 2013-01-31

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

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

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

image

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

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

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

Money類型包含User實體和Currency枚舉和一個數(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; }
}

對于DepositServiceNoSharp和WithdrawalServiceNoSharp這兩個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實現(xiàn)類型共享

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

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

image

找到MetadataSources節(jié)點(diǎn),原來只有一個,現(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ù)都會生成到同一個命名空間里,實現(xiàn)類型共享。

最后感謝原作者,原文鏈接。

還有順道向微軟出示一下中指,把這個功能隱藏得這么深。

The End!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多