前两天看听说.Net Core 2正式版发布,不过由于工作比较忙没来得及看(感觉愧对软粉称号啊,哈哈),今天就来稍微看看。
进入正题,这期的.Net Conf大概可以概括为:
- VS系列的工具链同步更新 / Visual Studio for Mac(我的VS2017已经收到了15.3的更新了,安装速度相比之前有所改观,Mac版安装时甚至直接把带宽跑满了)
- 由于红帽、三星、谷歌之类的这些重量级选手的加入,新版本也解决了很多性能问题,所以这是目前为止效率最高的.NET;
- 相比1.x,.Net Standard 2新增了大约2W的API,因此可以引用更多的.NET库了(没错,Windows上的.NET Framework的库也是可以的)
- Live Unit Testing
- Azure Function
- ASP.NET Core 2 / Entity Framework 2
下面就挑几个我比较感兴趣的地方:
新增API,使能引用更多的类库:
由于API的覆盖,所以我们有机会可以使用以前的古老类库(例如.Net Framework 2.0的),根据微软的统计,目前有大约70%的NuGet包可以被引用进来使用!
可能有朋友以前试过,如果在.NET Core 1.x里面引用非.NET Standard的库(例如下图中的SharpZipLib,上次更新还是2011年……),那么会遇到类似下面这样的提示:
而在2.0中,该库可以被正确引用:
想当初想在其他平台使用.NET Framework 2/3.5 的类库就跟做梦似的,但是现在可以了。
Live Unit Testing:
从下面这个图我们可以看到,这是一个实时的、持续的,并且能精确到语句的单元测试,这个功能我也是非常喜欢。不过由于这个功能是企业版独享的功能,我就无福消受了。嘛,还是有办法体验到的,在公司的台式机上装了个Preview版,可以试用3个月呢。
我们来假设这样一种情况:假如我是一个公司的项目经理兼程序员兼测试人员,我要怎样才能通过这个功能增加我这个大团队的开发效率呢?下面来亲自试一下:
首先,我的分身1(项目经理)准备好Interface:
1 2 3 4 5 |
public interface ILoli { string Name { get; set; } uint Age { get; } } |
然后编写单元测试:
1 2 3 4 5 6 7 8 9 |
[TestMethod] public void TestMethod1() { ConsoleApp1.ILoli obj = ConsoleApp1.Program.ALoli; //名字都没有怎么行 Assert.IsNotNull(obj.Name); //20岁就是大女孩啦 Assert.IsTrue(obj.Age<20); } |
分身2(程序员)编写代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Loli : ILoli { public Loli(string name,uint age) { Name = name; Age = age; } public string Name { get; set; } public uint Age { get; } public override string ToString() { return $"Hello my name is {Name}, and I'm {Age} years old"; } } |
在以前我们比较通俗的做法是把单元测试交给持续集成来做,一般的持续集成都可以给出覆盖率,但是我为何不能让程序员写代码的时候就仔细一点呢?这时候,Live Unit Testing就派上用场了,我们在菜单栏点击 Test->Live Unit Testing->Start 以启动:
这时候Live Unit Testing就会在后台进行不可告人的操作了,稍等片刻,我就能在编辑器的左边的行号的旁边看到多出了一栏,并且在代码行出现相应的图标。不过我的代码看起来并不健康:
点击一下红叉会告诉我们当前测试未通过的源头,双击跳转到单元测试代码处:
我们可以看到,代码跑到15行之后就终止了,从代码上可以看出,我们代码里的年龄写大了,于是在代码中将年龄改为正确的数值,刚按下Ctrl+S,测试就已经完成:
Very good,又阻止了一场测试人员于程序员之间的矛盾冲突,于是分身3(测试)可以把更多的精力投入到其他地方咯~
Azure Function:
这玩意其实在其他家的云计算中也出现过(例如亚马逊的AWS Lambda),这类东西是最新兴起的一种叫做Serverless的架构模式,有个比较文艺的名字,FaaS(Functions as a Service),顾名思义,函数即服务,可以通过编写一些简单的代码,来实现一些例如API、消息队列之类的功能,无需关心后端服务器的架构、维护之类的,即写即用,不用花过多的时间在运维上面,对我来说其实还是很不错的,至少假如我想搞个api,不用再购买vps或是折腾运行环境之类的,而是直接发布成函数,把更多的精力投入到业务逻辑上,岂不美哉~
这里我就依葫芦画下瓢,搞个消息队列:
首先创建Storage账户,因为Queue也在这个服务里面
接下来打开VS,创建Azure Functions的项目
创建好之后,在local.settings.json里填上第一步创建的Storage账户连接字串
然后右键 Project->Add->New Item… 创建Function,注意这里的Connection要和local.settings.json中的Values里的连接字串的Key保持一致
听说这种在线的玩意很难调试?NoNoNo。打个断点,然后直接F5:
启动好之后打开Azure Storage Explorer,在Queue里压入一条消息
然后就会发现断点命中了。
接下来把这个函数发布出去,右击项目->Publish…->点Publish按钮,一路下一步
发布成功之后,会在Azure Portal中看到我们的函数
再去压入一条消息,日志里也出现了记录,不错!
除了消息队列之外,还有很多函数类型,例如人脸追踪、GitHub WebHook之类,感觉比较适用于那种业务逻辑不太复杂但是需要频繁使用的场景。
ASP.NET Core 2 / Entity Framework 2:
ASP.NET Core方面,新增了2个非常著名的Web前端框架的模板
同时ApplicationInsights也更新到了2.1.1,在Azure Portal中可以一键将ApplicationInsights置入当前实例
Entity Framework 2的话:
比较吸引我的地方是:
- Linq的Where可以直接写 EF.Functions.Like(c.UserName, ""); 来like数据了
- 通过 modelBuilder.Entity<Something>().HasQueryFilter(c => !c.IsDeleted); 直接设置全局的筛选
- 将 services.AddDbContext<T> 改为 services.AddDbContextPool<T> 来增加效率(视频中效率增加近一倍)
- 在FromSql中增加对文字插补的支持,例如 context.Customers.FromSql($@"SELECT * FROM Customers WHERE City = {city}"); 中的city会被自动翻译成SqlParameter传入查询,而不是变成文字直接查询。
最后:
2.0相比1.0的进步的确是很大的,先抛开其他的不谈,光是能把原来那些Windows Only的库在其他平台上支持到这种程度我觉得已经是一个很了不起的工程了,在此也对微软表达一下敬佩以及感谢。
2条评论. Leave new
楼主用的是Azure吗, 怎么购买海外版本啊. 国内的世纪互联版本阉割太严重了. 作为软粉受不了…
我是买Visual Studio Pro送的Azure订阅,每月有400港币额度,有地域限制,比如亚洲只能选新加坡。