新建项目时,程序入口调用CreateDefaultBuilder(args),下面是源代码
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new HostBuilder(); builder.UseContentRoot(Directory.GetCurrentDirectory());
builder.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables(prefix: "DOTNET_");
if (args != null)
{
config.AddCommandLine(args);
}
}); builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName))
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
} config.AddEnvironmentVariables(); if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, logging) =>
{
var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); // IMPORTANT: This needs to be added *before* configuration is loaded, this lets
// the defaults be overridden by the configuration.
if (isWindows)
{
// Default the EventLogLoggerProvider to warning or above
logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
} logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger(); if (isWindows)
{
// Add the EventLogLoggerProvider on windows machines
logging.AddEventLog();
}
})
.UseDefaultServiceProvider((context, options) =>
{
var isDevelopment = context.HostingEnvironment.IsDevelopment();
options.ValidateScopes = isDevelopment;
options.ValidateOnBuild = isDevelopment;
}); return builder;
}

从上面代码看见这个方法帮我们处理的东西

  1. 设置根目录为当前目录
  2. 配置应用程序配置
  3. 配置日志配置
  4. 配置依赖注入

配置文件

配置文件内容如下
{"Setting": {
"Name": "Wilson",
"Date": "2019-10-28"
}
}
 一、注入IConfiguration
public IndexModel(IConfiguration config)
{
  var name = config.GetSection("Setting").GetValue<string>("Name");
  var date = config.GetSection("Setting").GetValue<DateTime>("Date");
}

二、通过IOptions注入

1. 在ConfigureServices添加Options支持和配置文件节点

public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<Setting>(Configuration.GetSection("Setting"));
}

2. 构造函数里面注入IOptions

public IndexModel(IOptions<Setting> option)
{
var setting = option.Value; var name = setting.Name;
var date = setting.Date;
}

三、绑定到类

public IndexModel(IConfiguration config)
{
var setting = new Setting();
config.GetSection("Setting").Bind(setting);
}

或者

public IndexModel(IConfiguration config)
{
var setting = config.GetSection("Setting").Get<Setting>();
}

四、页面读取配置文件

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration <div class="text-center">
<h3 class="color-red">@Configuration["Setting:Name"]</h3>
</div>

我个人推荐使用第二种方式去读取配置文件,因为它隐藏了如何读取配置文件,只需要获取我们关心的信息即可,第一,第三种都在不同地方使用硬编码的方式去读取(当然可以设置为常量),而且还有知道节点信息

开发过程通常不同环境是读取不同配置,ASPNET Core提供了一个很方便的方法去实现

截取源代码部分代码

var env = hostingContext.HostingEnvironment;

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

它会除了加载appsettings.json外,还好加载当前环境的json配置文件

我们只要设置当前环境环境变量(项目设置或者当前电脑环境变量添加ASPNETCORE_ENVIRONMENT)就能加载不同配置文件

日志

截取源代码部分代码

var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

// IMPORTANT: This needs to be added *before* configuration is loaded, this lets
// the defaults be overridden by the configuration.
if (isWindows)
{
// Default the EventLogLoggerProvider to warning or above
logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
} logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger(); if (isWindows)
{
// Add the EventLogLoggerProvider on windows machines
logging.AddEventLog();
}

除了配置基本信息,Windows操作系统Waring以上的日志还会写入到EventLog

现在我们写几个日志试试,因为配置了,所以我们直接注入logger写日志

public IndexModel(Logger<IndexModel> logger)
{
logger.LogDebug("This is Debug Message");
logger.LogInformation("This is Information Message");
logger.LogWarning("This is Warning Message");
logger.LogError("This is Error Message");
}

看到控制台输出

接着我们看看Evenlog有没有写入数

我们看到警告基本以上的日志都写入了

实际应用我们通常需要将日志写入文本文件,但ASPNET Core内置日志记录提供程序并没有提供文本文件的程序,但是我们可以使用第三方日志组件(例如log4net)

1. Nuget添加log4net(Microsoft.Extensions.Logging.Log4Net.AspNetCore)

2. 调用日志记录框架提供的 ILoggerFactory 扩展方法。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net();
.....
}

访问一下,看看写入日志

可以看到,除了中间那段是我们写入的,其他都是系统的日志

在源代码里面可以看到,系统是添加Logging节点的配置信息,里面可以指定日志类别

"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Warning",
"Microsoft": "Warning"
}
}
 指定System和Microsoft类别为Warning,只有高于这个级别才会输出到日志

可以设置莫一类别的日志级别

"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Warning",
"Microsoft": "Information",
"Microsoft.AspNetCore.Mvc":"Warning"
}
}

只能设置大的级别再设置小级别才有效,即若只设置Microsoft.AspNetCore.Mvc,不设置Microsoft就不起效果

依赖注入

ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术。

在CreateDefaultBuilder最后是一个扩展方法,使用默认的DefaultServiceProviderFactory

ASP.NET Core 提供三种注册方法

方法 描述 适合场景
AddTransient
 每次从服务容器进行请求时都是新建 轻量级、 无状态的服务
AddScoped
 每次请求/连接是同一个对象 Http请求需要保持同一个对象
AddSingleton
 单例 单例对象 

一、添加服务

public void ConfigureServices(IServiceCollection services)
{
  ...
 
services.AddSingleton<IServiceSingleton, ServiceSingleton>();
services.AddScoped<IServiceScoped, ServiceScoped>();
services.AddTransient<IServicesTransient, ServicesTransient>();
services.AddTransient<IMyService, MyService>();
}
二、 获取服务方式
1. 构造函数获取
public IndexModel(IServicesTransient servicesTransient)
{
}

2. 通过IHttpContextAccessor获取

  2.1 注入IHttpContextAccessor

public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

  2.2 通过RequestServices获取

var service = accessor.HttpContext.RequestServices.GetService<IMyService>();
service.Run();

三、使用第三方容器

内置的容器实现最基本的注入方式,已经能满足大部分项目需求。但是有时候可能需要特殊的需求,例如属性注入、基于名称的注入、自定义生存期管理等功能时,内置的容器不支持这些功能。下面介绍如何替换内置容器,以Autofac为例

1. nuget 添加Autofac.Extensions.DependencyInjection

2. Program替换容器

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())

3. Startup类添加方法ConfigureContainer

public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>(); builder.RegisterAssemblyTypes(System.Reflection.Assembly.GetExecutingAssembly())
.Where(m => m.Name.Contains("Service"))
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
}

这是ASPNET Core 3.0+版本替换Autofac方法,3.0不支持返回IServiceProvider

【ASP.NET Core学习】基础的更多相关文章

  1. 2019年ASP.NET Core学习路线

    - [先决条件] + C# + Entity Framework + ASP.NET Core + SQL 基础知识 - [通用开发技能] + 学习 GIT, 在 GitHub 中创建开源项目 + 掌 ...

  2. ASP.NET Core学习系列

    .NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...

  3. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  4. ASP.NET Core学习指导

    ASP.NET Core 学习指导 "工欲善其事必先利其器".我们在做事情之前,总应该做好充分的准备,熟悉自己的工具.就像玩游戏有一些最低配置一样,学习一个新的框架,也需要有一些基 ...

  5. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  6. ASP.NET Core学习零散记录

    赶着潮流听着歌,学着.net玩着Core 竹子学Core,目前主要看老A(http://www.cnblogs.com/artech/)和tom大叔的博客(http://www.cnblogs.com ...

  7. ASP.NET Core学习之一 入门简介

    一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问 ...

  8. ASP.NET Core学习总结(1)

    经过那么长时间的学习,终于想给自己这段时间的学习工作做个总结了.记得刚开始学习的时候,什么资料都没有,光就啃文档.不过,值得庆幸的是,自己总算还有一些Web开发的基础.至少ASP.NET的WebFor ...

  9. ASP.NET Core学习之三 NLog日志

    上一篇简单介绍了日志的使用方法,也仅仅是用来做下学习,更何况只能在console输出. NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 2.0 ,目前的版本也只有 ...

随机推荐

  1. JavaScript图形实例:五角星

    1.五角星 在半径为80的圆周上取5个点,用这5个点依次首尾连接画5条线,可以绘制出一个五角星图案. 编写如下的HTML代码. <!DOCTYPE html> <head> & ...

  2. 分布式事务之解决方案(XA和2PC)

    3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1. 什么是2PC 2PC即两阶段提交协议,是将整 ...

  3. 搭建zabbix 4.0

    [root@localhost /]# sed ‐i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config #永 ...

  4. linux中批量添加文件前缀的操作

    需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件“xxx.txt”变成“gt_xxx.txt”: 网上搜来的脚本如下: for i in `ls`; do ...

  5. CodeForces - 158C(模拟)

    题意 https://vjudge.net/problem/CodeForces-158C 你需要实现类似 Unix / Linux 下的 cd 和 pwd 命令. 一开始,用户处于根目录 / 下. ...

  6. C#_.NetCore_Web项目_EXCEL数据导出(ExcelHelper_第一版)

    项目需要引用NPOI的Nuget包:DotNetCore.NPOI-v1.2.2 A-前端触发下载Excel的方法有三种: 1-JS-Url跳转请求-后台需要返回文件流数据: window.Locat ...

  7. JavaWeb入门——Tomcat的目录结构

    JavaWeb入门——Tomcat的目录结构 摘要:本文主要了解了Tomcat的目录结构. 目录结构 打开Tomcat的目录,可以看到如下文件和文件夹: bin目录 该目录下存放的是二进制可执行文件. ...

  8. Audit Object Changes 审核对象更改

    Important 重要 The Audit Trail module is not supported by the Entity Framework ORM in the current vers ...

  9. Android Studio的安装及第一次启动时的配置

    Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...

  10. windows下安装了2个python,如何下载模块到不同的python中

    修改python名称即可,修改Scrpit下的pip名称即可,用不同的名称打开就行 https://www.cnblogs.com/legend-123/p/11195706.html