【ASP.NET Core学习】基础

新建项目时,程序入口调用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

Autofac.Extensions.DependencyInjection

原文地址:https://www.cnblogs.com/WilsonPan/p/11751028.html

时间: 2024-10-10 04:52:17

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

ASP.NET Core学习系列

.NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET Core学习之四 在CentOS上部署.net core LINUX学习系列 DOCKER学习系列 微服务学习系列 原文地址:https://www.cnblogs.com/xcsn/p/8306854.html

ASP.NET Core学习零散记录

赶着潮流听着歌,学着.net玩着Core 竹子学Core,目前主要看老A(http://www.cnblogs.com/artech/)和tom大叔的博客(http://www.cnblogs.com/TomXu/),当然还有我们博客园的Core中国学习小组啦(http://www.cnblogs.com/dotNETCoreSG/),只是笔记作用,所以很多图片,文字都是来源于他们~ 中间件(middleware): 原文:随着WebHost的Start方法的调用,按照具体需求进行定制的请求处理

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

一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问题”,是简单的问题,对,就是简单,就是因为觉得简单被忽略的东西,恰恰这才是最重要的. 1.学习资料 首先,介绍下哪里可以获得学习资料 英文官网,最好的文档,英语得过硬 https://docs.microsoft.com/en-us/aspnet/core/ 可惜当年英语就是马马虎虎过来的,所以找了

ASP.NET Core学习总结(1)

经过那么长时间的学习,终于想给自己这段时间的学习工作做个总结了.记得刚开始学习的时候,什么资料都没有,光就啃文档.不过,值得庆幸的是,自己总算还有一些Web开发的基础.至少ASP.NET的WebForm和MVC那一套还是有所了解的,虽然也不是很精通.说起来,那时候对整个网络应用的整体流程以及什么HTTP协议都不是很了解.终归是在微软爸爸的庇护下艰难的成长. 1.概念 概念这种东西,感觉还是太过于学术化.也就是时间长了,慢慢就能理解的一些经常用到的词而已.对于大多数人来说,我们几乎每天都会浏览网页

ASP.NET Core学习之三 NLog日志

上一篇简单介绍了日志的使用方法,也仅仅是用来做下学习,更何况只能在console输出. NLog已是日志库的一员大佬,使用也简单方便,本文介绍的环境是居于.NET CORE 2.0 ,目前的版本也只有beta版. 一.安装和配置 1.安装 命令如下 PM> Install-Package NLog.Web.AspNetCore -Version 4.5.0-beta04 2.创建配置文件 在web项目根目录下,创建配置文件nlog.config ,并且将文件的属性“复制到输出目录”设置为"

ASP.NET Core学习——2

Application Startup ASP.NET Core为应用程序提供了处理每个请求的完整控制.Startup类是应用程程的入口(entry point),这个类可以设置配置(configuration),并且将应用程序将要使用的服务连接起来. 开发人员可以在Startup类中配置请求管道,该管道将用于处理应用程序的所有请求. 1.Startup类 在ASP.NET Core中,Startup类提供了应用程序的入口,而且在所有应用程序中都有Startup类. Startup类能够选择性地

ASP.NET Core学习——6

依赖注入DI ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入. 1.什么是依赖注入 依赖注入(Dependency injection, DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术.将类来执行其操作(Action)的这些对象以某种方式提供给类,而不是直接实例化合作者或使用静态引用.通常,类会通过它们的构造函数声明其依赖关系,允许它们遵循显示依赖原则(Explicit

ASP.NET Core学习——7

多环境ASP.NET Core介绍了支持在多种环境中管理应用程序行为的改进,如开发(devlopment),预演(staging)和生成(production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当地配置. 1.开发.预演和生成ASP.NET Core引用了一个特定的环境变量ASPNETCORE_ENVIRONMENT来描述应用程序当前运行的环境.这个变量可以被设置为任何你喜欢的值,但是有三个值被约定使用:Development(开发).Staging(预演)和Product

【ASP.NET Core学习】Web API

这里介绍在ASP.NET Core中使用Web API创建 RESTful 服务,本文使用VSCode + NET Core3.0 创建简单Rest API 格式化输出 JSON Patch请求 Open API(Swagger)集成 创建简单Rest API 在终端输入 dotnet new webapi -n WebAPI 1. 创建Order模型,然后初始化数据 public class OrderStore { public List<Order> Orders { get; } =