ASP.NET Core 1.0 开发记录

ASP.NET Core 1.0 更新比较快(可能后面更新就不大了),阅读注意时间节点,这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录,以备查阅。

ASP.NET Core 1.0 相关 Nuget 程序包源:https://api.nuget.org/v3/index.json

阅读目录:

  • 理解 .NET Platform Standard

  • Startup 配置

    • Sample.BootStrapper.Startup 配置

    • ASP.NET Core 1.0 Startup 配置

  • UnitTest 单元测试

    • 类库项目单元测试

    • WebApi 项目单元测试

  • Microsoft.EntityFrameworkCore

    • 基本配置(MySql)

    • ModelBuilderExtenions 扩展

    • 记录执行 SQL

    • EntityFrameworkCore 迁移

  • CLI 命令

1. 理解 .NET Platform Standard

在用 ASP.NET Core 1.0 开发之前,理解 .NET Platform Standard(.NET 平台标准)是非常有必要的,因为部署是跨平台的,ASP.NET Core 1.0 应用程序的配置不同,部署环境也会不同,并且项目之间的兼容也会存在一些问题。

.NET Platform Standard 列表(2016 上半年):

Target Platform NameAlias       
.NET Platform Standardnetstandard1.01.11.21.31.41.51.6
.NET Corenetcoreapp1.0
.NET Frameworknet4.6.3


4.6.2


4.6.1



4.6




4.5.2





4.5.1





4.5




Universal Windows Platformuap10.0

Windowswin8.1





8.0




Windows Phonewpa8.1



Windows Phone Silverlightwp8.1







8.0





Mono/Xamarin Platforms
*
Mono
*



上面图表时间虽然有点老,但和现在的发展是一样的,只不过版本有所更新,主要的三个平台:

  • .NET Platform Standard(netstandard):.NET 平台标准,或者称为 .NET 通用平台,是 .NET 部署所有平台的一种通用标准规范(包含 Windows、Mac、Linux 等),建议使用,现在最新版本是 1.6 (2.0 版本快发布)。

  • .NET Core(netcoreapp):.NET Core SDK running on CoreCLR/CoreFx,简单来说,可以跑在安装 CoreCLR/CoreFx 的任何平台上(包含 Windows、Mac、Linux 等),前提必须是有 .NET Core 的运行环境,建议使用,现在最新版本是 1.1.0

  • .NET Framework(net):.Net Framework SDK running on Desktop CLR / Full BCL and FCL,简单来说,只能跑在 Windows 平台上,不建议使用,最新版本是 4.6.3。

我们在开发 ASP.NET Core 1.0 应用程序的时候,一般是选择netstandardnetcoreapp版本,并且这两个平台版本是相互兼容的,分别看一下示例:

netstandard1.6平台:

{"version": "1.0.0","dependencies": {"Microsoft.EntityFrameworkCore": "1.0.0","NETStandard.Library": "1.6.1"},"frameworks": {"netstandard1.6": {"imports": "dnxcore50"}}}
  • "imports": "dnxcore50" 的意思是兼容之前dnxcore50平台(dnxcore50现在已被废弃,并被netcoreapp取代),比如你之前有个类库是用dnxcore50平台开发的,现在使用netstandard平台开发的类库,如果不添加此配置,是会报错的。

  • "NETStandard.Library": "1.6.1"包含了一系列和netstandard相关的 Nuget 程序包,配置netstandard平台,必须添加此配置,如果没有的话,.NET 基础的命名空间是访问不到的。

netcoreapp1.1.0平台:

{"version": "1.0.0","dependencies": {"Microsoft.EntityFrameworkCore": "1.0.0"},"frameworks": {"netcoreapp1.1.0": {"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.1.0"}}},"imports": ["dotnet5.6","portable-net45+win10"]}}}

netstandard1.1.0平台和上面netstandard1.6平台配置差不多,Microsoft.NETCore.App 和 NETStandard.Library 是一样目的,dotnet5.6dnxcore50一样,都是 .NET Core 之前平台的废弃代号。

portable 的意思是便携型,如果添加了此配置,表示应用程序发布部署不携带依赖的程序包,而是使用系统中安装配置的。

还有一点需要注意的是,netcoreapp1.1.0平台和netstandard1.6平台开发是相互兼容的,比如我们开发一些自己的 Nuget 程序包,使用的平台版本可以是上面两个,但最好是使用netstandard低一点的版本,因为以后netstandard可能是微软平台的一种标准规范,比如我现在开发 Nuget 程序包平台使用netcoreapp1.1.0,ASP.NET Core 1.0 应用程序使用netcoreapp1.1.0平台,后者就可以引用前者,因为第三方 Nuget 程序包使用平台版本可能比较低,所以我们开发的 ASP.NET Core 1.0 应用程序平台版本也相应低一些。

2. Startup 配置

Startup 需要添加额外的配置,以便于单元测试的进行,比如 EF、依赖注入和 AutoMapper 配置,需要独立进行配置,而不是放在 ASP.NET Core 1.0 应用程序中的 Startup 配置中。

2.1 Sample.BootStrapper.Startup 配置

比如这样的一个项目 Sample.BootStrapper:

project.json 配置:

{"version": "1.0.0-*","dependencies": {"System.ComponentModel.Primitives": "4.1.0","Microsoft.NETCore.App": ""},"frameworks": {"netcoreapp1.1.0": {"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.1.0"}}}}}

上面代码主要是对 IServiceCollection 的 Configure 方法进行了扩展,这样对 Domain、Repository 和 AppliactionService 进行独立的单元测试了,只需要在构造函数中进行添加调用即可,后面再说这一点。

2.2 ASP.NET Core 1.0 Startup 配置

另外,ASP.NET Core 1.0 应用程序的 Startup 示例代码:

public class Startup
{    public Startup(IHostingEnvironment env){#if DEBUG        var path = Directory.GetCurrentDirectory();#elsevar path = env.ContentRootPath;#endifvar builder = new ConfigurationBuilder().SetBasePath(path).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true).AddEnvironmentVariables();Configuration = builder.Build();Log.Logger = new LoggerConfiguration().MinimumLevel.Error().WriteTo.RollingFile(Path.GetFullPath("logs/log-{Date}.txt")).CreateLogger();}    public IConfigurationRoot Configuration { get; }    
     
     // This method gets called by the runtime. Use this method to
      add services to the container.
public void ConfigureServices(IServiceCollection services){  // Add framework services.// 配置 WebApi 返回 Json 数据大小写问题,默认数据会首字母小写。services.AddMvc().AddJsonOptions(options =>
      options.SerializerSettings.ContractResolver = new DefaultContractResolver());  
      // 注意这里services.Configure(Configuration["data:ConnectionString"]);}  

   // This method gets called by the runtime. Use this method to configure the
             HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
         ILoggerFactory loggerFactory){loggerFactory.AddSerilog();loggerFactory.AddConsole(Configuration.GetSection("Logging"));loggerFactory.AddDebug();app.UseStaticFiles();app.UseMvc();} }

日志服务使用的是 Serilog,日志级别有多种进行选择(可以 Debug、Error 等),日志和连接字符串的配置可以放在 appsettings.json 文件中,ConfigureServices 里面调用 Sample.BootStrapper.StartUp 的配置。

project.json 示例代码:

{"dependencies": {"Microsoft.AspNetCore.Mvc": "1.0.1","Microsoft.AspNetCore.Routing": "1.0.1","Microsoft.AspNetCore.Server.IISIntegration": "1.0.0","Microsoft.AspNetCore.Server.Kestrel": "1.0.1","Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0","Microsoft.Extensions.Configuration.FileExtensions": "1.0.0","Microsoft.Extensions.Configuration.Json": "1.0.0","Microsoft.Extensions.Logging": "1.1.0","Microsoft.Extensions.Logging.Console": "1.0.0","Microsoft.Extensions.Logging.Debug": "1.0.0","Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0","Microsoft.AspNetCore.Cors": "1.0.0","Serilog": "2.3.0","Serilog.Extensions.Logging":"1.3.1","Serilog.Sinks.RollingFile": "3.2.0","Microsoft.AspNetCore.StaticFiles": "1.0.0","Sample.BootStrapper": "1.0.0-*","Microsoft.EntityFrameworkCore.Design": {"type": "build","version": "1.0.0-preview2-final"}},"tools": {"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final","Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"},"frameworks": {"netcoreapp1.0.1": {"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.0.1"}},"imports": ["dotnet5.6","portable-net45+win10"]}},"buildOptions": {"emitEntryPoint": true,"preserveCompilationContext": true},"runtimeOptions": {"configProperties": {"System.GC.Server": true}},"publishOptions": {"include": ["wwwroot","**/*.cshtml","appsettings.json","web.config"]},"scripts": {"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% 
           --framework %publish:FullTargetFramework%"
]}}

appsettings.json 示例代码:

{"data": {"ConnectionString": ""},"Logging": {"IncludeScopes": false,"LogLevel": {"Default": "Error","System": "Information","Microsoft": "Information"}}}

另外,在 Program.cs 中可以配置选择服务器,比如 IIS 或 Kestrel 等。

3. UnitTest 单元测试

相关文章:

  • Getting started with xUnit.net (.NET Core / ASP.NET Core)

  • Integration Testing

单元测试主要包含两方面:类库项目单元测试和 WebApi 项目单元测试。

3.1 类库项目单元测试

类库项目单元测试代码示例:

provider.GetService 手动获取依赖注入的对象,ITestOutputHelper 的目的是取代Console.WriteLine(因为不支持),但现在 ITestOutputHelper 好像也输出不了,之前 RC2 的时候是可以的,不知道啥原因。

3.1 WebApi 项目单元测试

WebApi 项目单元测试示例代码:

RC2 版本是无法对 WebApi 进行单元测试的,因为 TestHost 不支持,现在 ASP.NET Core 1.0 版本和 ASP.NET WebApi 2 是差不多的了,使用也很方便,不过 HttpClient 没有了 PostAsJsonAsync 方法,需要使用 JsonConvert 手动转换一下。

project.json 配置代码:

{"version": "1.0.0-*","testRunner": "xunit","dependencies": {"xunit": "2.2.0-beta4-build3444","dotnet-test-xunit": "2.2.0-preview2-build1029","Microsoft.AspNetCore.TestHost": "1.0.0","Microsoft.Extensions.DependencyInjection": "1.1.0","Sample.BootStrapper": "1.0.0-*","Sample.WebApi": "1.0.0-*"},"frameworks": {"netcoreapp1.0.1": {"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.0.1"}},"imports": ["dotnet5.6","portable-net45+win10"]}}}

我之前用netstandard1.6平台,但配置 xunit 的时候,发现不支持最新的版本,后来就该用了netcoreapp1.0.1testRunner 配置后可以在 Test Explorer 窗口中看到单元测试,也可以在方法的窗口上看到,主要用于调试目的。

单元测试命令:dotnet test

4. Microsoft.EntityFrameworkCore

相关资料:Entity Framework Core

4.1 基本配置

Microsoft.EntityFrameworkCore 和 EntityFramework 7 的用法差不多,现在项目使用的 MySql 数据库,示例配置代码:

4.2 ModelBuilderExtenions 扩展

AddEntityConfigurationsFromAssembly 是对 ModelBuilder 的扩展,这样如果有多个实体映射配置,OnModelCreating 中只需要一行代码就可以了,扩展代码:

project.json 示例代码:

{"version": "1.0.0-*","dependencies": {"MySql.Data.EntityFrameworkCore": "7.0.6-IR31","MySql.Data": "7.0.6-IR31","System.Reflection.TypeExtensions": "4.3.0","Microsoft.Extensions.DependencyInjection": "1.1.0"},"frameworks": {"netcoreapp1.0.1": {"dependencies": {"Microsoft.NETCore.App": {"type": "platform","version": "1.0.1"}}}}}

EntityFrameworkCore 针对 MySql 微软没有开放相应的 Nuget 程序包,第三方有很多的程序包,但或多或少的有些问题,MySql.Data.EntityFrameworkCore 是 EntityFrameworkCore GitHub Issue 中出现最多的,并且是 MySql 自己开发的,所以使用的话没什么问题。

如果在查询的时候报这个错误:

System.MissingMethodException was unhandled
HResult=-2146233069
Message=Method not found: 'Void Microsoft.EntityFrameworkCore.Query.QueryContextFactory..ctor(Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IStateManager, Microsoft.EntityFrameworkCore.Internal.IConcurrencyDetector, Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeDetector)'.
Source=Microsoft.EntityFrameworkCore.Relational
StackTrace:
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalQueryContextFactory..ctor(IStateManager stateManager, IConcurrencyDetector concurrencyDetector, IRelationalConnection connection, IChangeDetector changeDetector)
--- End of stack trace from previous location where exception was thrown ---

解决方式是引用 MySql.Data.EntityFrameworkCore 程序包的类库,移除 Microsoft.EntityFrameworkCore 程序包,参考资料:MissingMethodException DbSet.ToList

4.3 记录执行 SQL

另外,关于 EntityFrameworkCore 如何记录执行 SQL,Google 找了好久也没找到好的解决方案,最后找到了一个别人写的 IQueryable 扩展方法:

调用示例:

var query = _productRepository.Get(1);var sql = query.ToSql();
Console.WriteLine(sql);

不过暂时只能输出单表查询的,多表关联查询的执行 SQL 输出不了。

4.4 EntityFrameworkCore 迁移

相关文章:

  • EntityFramework 7 Migrations 迁移命令

  • EntityFrameworkCore Migrations

相对于 EntityFramework 7,EntityFrameworkCore 迁移改变很多,

首先,ASP.NET Core 1.0 project.json 中添加如下配置:

{"dependencies": {"Microsoft.EntityFrameworkCore.Design": {"type": "build","version": "1.0.0-preview2-final"}},"tools": {"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"},"frameworks": {"netcoreapp1.0.1": { }}}

Sample.BootStrapper.Startup 中 Configure 修改如下:

public static void Configure(this IServiceCollection services, string connectionString)
{services.AddDbContext<CommodityDbContext>(options =>options.UseMySQL(connectionString, b => b.MigrationsAssembly("Sample.WebApi"))
         //添加 MigrationsAssembly);    ///to do...

然后 CMD 直接切换到 Sample.WebApi 文件目录下,执行如下命令:

  • dotnet ef migrations add 名称

  • dotnet ef database update

5. CLI 命令

相关资料:.NET Core 命令行接口工具

dotnet 具有以下命令:

  • dotnet new:初始化 C# 或 F # 控制台应用程序项目。

  • dotnet restore:还原给定应用程序的依赖项。

  • dotnet build:生成 .NET Core 应用程序。

  • dotnet publish:发布 .NET 可移植或独立应用程序。

  • dotnet run:从源运行应用程序。

  • dotnet test:使用 project.json 中指定的测试运行程序运行测试。

  • dotnet pack:创建代码的 NuGet 包。

CLI 还支持持续集成,不过没试过,我第一次用 dotnet pack,结合 Nuget Package Explorer 可以很方便的发布管理程序包。

原文地址:http://www.cnblogs.com/liubingbing/p/6343701.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出ClassLoader

转载自 深入浅出ClassLoader 你真的了解ClassLoader吗&#xff1f; 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? &#xff0c;融入和补充了笔者的一些实践、经验和样例。本文的例子比原文更加具有实际意义&#xff0c;文字内容也更充沛一些&#xf…

微软任命LinkedIn高级副总裁为首席技术官

Kevin Scott曾是LinkedIn工程方面的高级VP&#xff0c;被任命为微软CTO后&#xff0c;Scott将全面统筹微软战略规划&#xff0c;以主动的姿态推进公司间合作&#xff0c;以最大化微软在伙伴及客户间的影响力。据了解&#xff0c;该职位为新创职位&#xff0c;为微软公司级CTO&a…

jQuery 基础教程 (三)之jQuery的选择器

一、jQuery 选择器 &#xff08;1&#xff09;选择器是 jQuery 的根基, 在 jQuery 中, 对事件处理, 遍历 DOM 和 Ajax 操作都依赖于选择器 &#xff08;2&#xff09;jQuery 选择器的优点: 简洁的写法 $(#id) //documnet.getElementById(id); $(p) //documnet.getEl…

SQL Server 2014内存优化表的使用场景

最近一个朋友找到走起君&#xff0c;咨询走起君内存优化表如何做高可用的问题 大家知道&#xff0c;内存优化表是从SQL Server 2014开始引入&#xff0c;可能大家对内存优化表还是比较陌生&#xff0c;网上也鲜有内存优化表使用场景的文章 朋友公司做的业务是跟蜂鸟配送类似的配…

春节祝福提前到

2017 鸡 年 大 吉 HAPPY NEW YEAR 鸡年起算自二十四节气之立春&#xff0c;因为生肖年依附于干支纪年&#xff0c;而干支纪年又是干支历的纪年方法。历代官方历书&#xff08;即黄历&#xff09;皆如此。农历只是借用干支来纪年&#xff0c;和干支历是两种不同的历法&#xf…

jQuery 基础教程 (一)之jQuery的由来及简介

一、RIA技术 &#xff08;1&#xff09;RIA(Rich Internet Applications) 富互联网应用,具有高度互动性、丰富用户体验以及功能强大的客户端。 &#xff08;2&#xff09;常见的RIA技术 Ajax Flex Sliverlight &#xff08;3&#xff09;JavaScript及其框架是实现RIA的重…

外键

如图有两张表&#xff0c;classId 是T_Student的外键&#xff0c;是T_class 表的主键&#xff0c; 如果我们要删除T_class 表中classId为1的字段&#xff0c;程序是会报错的&#xff0c;因为t_student表中有数据和classId为1的字段关联了&#xff0c;是不能删除的&#xff0c;这…

新春大吉,2017 Make .NET Great

今天年初六&#xff0c;新春好景象&#xff0c;送礼处处有新意。这个春节暂停了几天的公众号更新&#xff0c;今天就和大家回顾下最近几天发生在我们身边的.NET 圈里的信息。 1、 微软正式公布了.NET Core SDK 1.0 RC3的信息&#xff0c;其实早已包含在最近更新的Visual Studio…

头条面试题:请谈谈Redis 9种数据结构以及它们的内部编码实现

转载自 头条面试题&#xff1a;请谈谈Redis 9种数据结构以及它们的内部编码实现 90%的人知道Redis 5种最基本的数据结构&#xff1b; 只有不到10%的人知道8种基本数据结构&#xff0c;5种基本bitmapGeoHashHyperLogLog&#xff1b; 只有不到5%的人知道9种基本数据结构&…

【初码干货】关于.NET玩爬虫这些事

这几天在微信群里又聊到.NET可以救中国但是案例太少不深的问题&#xff0c;我说.NET玩爬虫简直就是宇宙第一&#xff0c;于是大神朱永光说&#xff0c;你为何不来写一篇总结一下&#xff1f; 那么今天就全面的来总结一下&#xff0c;在.NET生态下&#xff0c;如何玩爬虫 关于爬…

【JVM】浅谈双亲委派和破坏双亲委派

转载自 【JVM】浅谈双亲委派和破坏双亲委派 一、前言 笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书&#xff0c;阅读完后自以为对jvm有了一定的了解&#xff0c;然而当真正碰到问题的时候&#xff0c;才发现自己读的有多粗糙&#xff0c;也体会到只有实践才能加深理…

开源OSS.Social微信项目解析

前言&#xff1a;OSS.Social是个开源的社交网站接口集成项目&#xff0c;当前也有很多其他不错的项目&#xff0c;不过始终没有我想要的那种简单清晰&#xff0c;只能撸起袖子&#xff0c;从头打造一个。当前正在进行的是对微信项目的开发&#xff0c;这里把对接口的整理&#…

Apdex(Application Performance Index)量化应用性能

“道琼斯指数帮助人们衡量股市行情变化&#xff0c;Apdex 指数帮助您衡量用户心情变化。“ 一.为什么需要 Apdex 性能指数&#xff0c;Apdex(Application Performance Index)是一个国际通用标准&#xff0c;Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告…

云计算设计模式(一)缓存预留模式

云带来的改变是显而易见的&#xff0c;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c;服务&am…

稀疏数组与二维数组相互转化

图示 二维数组转稀疏数组的思路 遍历 原始的二维数组&#xff0c;得到有效数据的个数 sum根据sum 就可以创建 稀疏数组 sparseArr int[sum 1] [3]将二维数组的有效数据数据存入到 稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行&#xff0c;根据第一行的…

云计算设计模式(二)——断路器模式

云带来的改变是显而易见的&#xff0c;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c;服务&am…

excel打开csv 出现乱码怎么解决 逗号分隔

excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写&#xff0c;通常都是纯文本文件。CSV格式是分隔的数据格式&#xff0c;有字段/列分隔的逗号字符和记录/行分隔换行符。通常CSV文件可以用EXCEL正常…