.Net 跨平台可移植类库正在进行
[原文发表地址] Cross-Platform Portable Class Libraries with .NET are Happening
[原文发表时间] 2013-7-9
可移植类库可以成为幸福的小特性。这些类库正在稳定发展,按照它们的意愿做着事情,并且变得很流行,以一种很好的方式流行着。
如果你没有为一个以上的平台写过.Net应用程序,那么你可能还没遇到过这些可移植类库。然而对那些编写过.Net程序并且希望程序能够在手表,手机,平板,Xboxen,桌面,云等所有平台都能正确运行的程序员来说,他们非常享受于可移植类库提供给他们的东西。
虽然还有几个技术方面和法律方面的难题,但是我确信这些问题都可以被解决掉,并且我们也将会创建非常棒的,在哪儿都能用的二进制类库。
最近.Net 社区有一系列围绕着可移植类库和跨平台.NET展开的活动。总而言之,可移植类库开始被广泛应用,越来越多支持移植的类库被发布,并且在跨平台应用程序中,MVVM模式正被证明是一种非常棒的最大化代码共享的方式。
可移植类库发布一览
首先,最近有一堆新可移植类库已被发布。其中有三个来自于GitHub的 Paul Betts:
- Reactive UI - Reactive UI 是一个构建于Reactive Extensions 之上的MVVM framework。上周已经发布了5.0版本,这是一个“完全友好性”可移植版本,并且支持以下平台:
- Xamarin iOS
- Xamarin Android
- Xamarin Mac
- .Net 4.5(WPF)
- Windows Phone 8
- Windows Store Apps(WinRT)
- Akavache- 一个异步的,持久的键值存储。3.0版本包含了PCL(Portable Class Library)支持,该版本上周也已经被分布了。所以现在,你的几乎所有的序列化和网络访问层代码都可以跨平台了。Akavache所支持的开发平台跟Reactive UI的一样。这真的是一个非常棒的软件,它值得拥有专属自己的博文。我等下会写一篇。
- Splat –“一个可以让代码跨平台的库。”它提供了图片和颜色的跨平台API,依靠特定平台的扩展方法在特定平台的本地类型之间转换。如果你遇到了这样一个问题,想在可移植视图模型下显示一个图片,那么无疑Splat是一个非常优质的解决方案。
接下来,是Scott LoveGrove自白:
我(Scott LoveGrove)此刻可能有点儿痴迷于PCLs。#我有一个问题(链接)
所以Scott(Scott LoveGrove)已经发布了四个用于访问web services的可移植类库:
- Scoreoid Portable – 一个让开发人员用于访问Scoreoid scoring系统的可移植类库。这个库为Scoreoid Rest APIs提供了一个友好的.Net包装器,并且使用了我们的可移植 HttpClient NuGet包。
- FanArt Portable – 一个开发人员可以用于访问fanart.tv 电影,TV和音乐图片资源的可移植类库。它也使用了可移植HttpClient包。
- Cineworld Portable – 一个开发人员可以用于访问Cineworld影片和浏览电影篇目的可移植类库,只用于英国和爱尔兰。它也使用了可移植HttpClient包。
- LiveSDKHelper – 一个帮助类库,让微软Live SDK的使用变得更加容易。它包含了那些能够被反序列化的Live SDK响应的强类型。
另外一个新发布的可移植类库是Budgie,用于访问Twitter。.Net小组和Azure小组同样也发布了一大堆可移植类库。
.Net 小组:
- HttpClient– 一个简化的API,用于与HTTP服务通话,公布于此。
- Microsoft.Bcl.Compression - GZIP, DEFLATE & ZIP compression压缩,使得Http变得很有效。
- Microsoft.Bcl.Async – 准备好了底层平台的等待/异步。
- Microsoft Composition 的MEF 2。
- TPL Dataflow(Actor/Agent-based API,用于协调异步管道),依赖于作为Microsoft.Tpl.Dataflow的NuGet,公布于此。
- Microsoft.Bcl.Immutable中的Immutable Collections,公布于此。
其他小组:
Azure Mobile Services 有一个可移植类库。
Rx Extensions
更不用说那些你已经很熟悉的优秀可移植类库。
MVVM
- MVVM Light Toolkit portable fork
- MvvmCross
- UpdateControls
IoC
- Autofac
- Ninject portable fork
- PortableIoC
- XplatUtils(IoC and Messager)
其他
当然了,我最爱HttpClient包,它让Http调用更加方便。几个月以前就有了。
1: public static async Task<HttpResponseMessage> GetTheGoodStuff()
2: {
3: var httpClient = new HttpClient();
4: HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://hanselman.com/blog/");
5: var response = await httpClient.SendAsync(request);
6: return response;
7: }
//build/
一个build与会者对于演讲者说的“你不能通过可移植类库使用某平台的独有功能”提出了质疑,同时还专门写了一篇博文,说明如何使用抽象化以及依赖注入(更适宜)来解决不能通过可移植类库使用某平台独有功能的问题。
最近至少在2种场合下,我都听到过演说者告诉他们的听众,你不能通过一个可移植类库去引用一个特定目标的 .NET类库(例如像.Net Framework4.5的类库)。虽然严格来说是这样的,但它并没说清楚这整个事实。即使我们无法引用特定目标的类库,但我们仍可以使用这些类库。我们可以调用它们提供的方法,访问它们的属性。我们可以通过一个抽象化手段来获取访问这些类库的权限。我自己更倾向于使用依赖注入的方式。
跨平台 .Net 真酷
“Draw a Stickman EPIC。” (画个火柴人)是我跟其他民间的一些开发人员一起做的一款游戏,它里头有大量的代码复用的例子。这个应用有95%以上的代码复用率,全都是用C#写的,每一个app商店都有都可用。再说一点其他的。
此外,请你一定要先看看我在Xamarin Evolve会议中的演讲(c#如何拯救了我的婚姻)。现在我将要谈谈可移植类库。我们可以从MonkeySpace Conference in Chicago in July of 2013 得到更多关于可移植类库的消息。
British and Irish Lions app 应用是一款定位于Windows商店, windows phone , IOS 和安卓的跨平台应用程序。它使用可移植类库,用于共享平台之间的通用代码,用到了从Azure到主机的服务,还用了我非常痴迷的MVVMCross MVVM framework。英国的MSDN博客写了一篇关于这款APP开发的一个学习实例,这儿还有一个更好的学习实例(带了截图啊,图表啊等等)以及一个开发人员写的博文。由于参考了Xamarin,MVVmCross,以及可移植类库,开发人员声明到,“考虑到The Lions app只给了很短的时间(从第一行代码的开发到第一个版本的发布,只用了不到三个月的时间),没有通用内核我们根本不可能交付一个跨所有平台的本地化丰富的程序。”
另一个用了MVVMCross的跨平台应用是Aviva Drive。这是一个保险公司的app,你可以用来跟踪你的驾驶习惯,从而很有希望在保险费上获取这款。这款应用在欧洲技术大会—第一天主题(about 28:40 in)上作为特色,大会关注它的焦点在于,它如何使用了Azure。
在游戏应用这方面,Taptitude是一款非常成功的Windows Phone7的游戏(或者说,是一个非常成功的迷你游戏的集合),它在MonoGame 和Xamarin的帮助下,已经被移植到了window phone8,windows 商店,IOS和安卓上。开发小组报告说,在所有平台上,他们有多达99%以上的代码共享部分,这对他们来说尤其重要,因为他们每周都在更新这款游戏。
Xamarin
Xamarin 已经发布了一个非常不可思议.NET Mobility Scanner,它能够分析代码并且告诉你它是如何“移植”的,并且它将如何的兼容Xamarin Android,Xamarin iOS,Windows Phone 以及Windows store。它能列举出那些在所有平台上你代码中用到的无效API,还列出你的代码“可移植性”的总体百分比。它执行起来非常灵活,而且跟我们一直以来想要可移植类库拥有的功能很类似。这里有一个用于SignalR 客户端类库的样本报告。它最棒的部分在于,不用给Xamarin发送你的代码或者二进制文件,就能够做所有的分析。 这些全部都是在浏览器上进行的。我非常喜欢Xamarin了。
Phil Haack(以前是ASP.Net MVC的经理,现在在GitHub工作)写了一篇博文,标题叫做 Platform Limitations Harm.NET。他提出,windows platform limitations 应该为BCL NuGet包让路,从EULAs中移除。
我个人对此表示赞同。能够复用已存在的代码,创建可移植类库,还能写在64k或者64gigs中跑的apps,这使得.NET成为一个非常有趣的开发平台工具。