一. 配置的读取

  在Asp.Net Core中,有一个 appsettings.json 文件,用于存储相应的配置信息,读取的时,要通过构造函数注入:IConfiguration Configuration,来进行读取。

  下面是一段配置文件,我们来对其进行读取:

读取代码:

 public IConfiguration Configuration { get; }
public FirstController(IConfiguration configuration)
{
Configuration = configuration;
}
{
var f0 = Configuration["MyFullName"];
var f1 = Configuration["User:userName"];
var f2 = Configuration["User:Child:childName"];
var f3 = Configuration["StudentList:0:sName"];
var f4 = Configuration["StudentList:1:sName"];
}

二. StartUp类

1. 说明:

  StartUp类中包括两个方法,分别是ConfigureServices和Configure,前者主要用来注册服务,后者主要用来创建和配置请 求管道,然后在Main方法中进行调用:

 WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();

2. ConfigureServices方法

(1). 它在Configure方法调用之前,由主机调用。

(2). 需要大量设置的功能,IServiceCollection 上有 Add{Service} 扩展方法,常见的如下:

  a:services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection")));

  b:services.AddDefaultIdentity<IdentityUser>().AddDefaultUI(UIFramework.Bootstrap4).AddEntityFrameworkStores<ApplicationDbContext>();

  c:services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

3. Configure方法

(1).用于配置Http请求管道,主要通过IApplicationBuilder实例来配置。

(2).常见的管道有:

  开发人员异常页(UseDeveloperExceptionPage)、

  HTTP严格传输安全性(UseHsts)、

  HTTPS重定向(UseHttpsRedirection)、

  静态文件(UseStaticFiles)、

  MVC(UseMvc)。

三. 内置依赖注入和扩展改造

1. 说明:

  这里不再介绍什么是IOC和DI,直接介绍内置依赖注入的使用方法和生命周期,最后介绍利用AutoFac进行替换内置IOC容器。事先准备好U1-U4四个类和IU1-IU4四个接口。

接口和类的代码:

   public interface IU1
{
string guid { get; set; }
string GetName();
}
public interface IU2
{
string guid { get; set; }
string GetName();
}
public interface IU3
{
string guid { get; set; }
string GetName();
}
public interface IU4
{
string guid { get; set; }
string GetName();
}

接口

  public class U1 : IU1
{
public string guid { get; set; } public U1()
{
guid = System.Guid.NewGuid().ToString("N");
} /// <summary>
/// 调用方法的时候,是单例也没有用,每次调用都会变
/// </summary>
/// <returns></returns>
public string GetName()
{
return System.Guid.NewGuid().ToString("N");
}
}
public class U2 : IU2
{
public string guid { get; set; } public U2()
{
guid = System.Guid.NewGuid().ToString("N");
} /// <summary>
/// 调用方法的时候,是单例也没有用,每次调用都会变
/// </summary>
/// <returns></returns>
public string GetName()
{
return System.Guid.NewGuid().ToString("N");
}
}
public class U3 : IU3
{
public string guid { get; set; } public U3()
{
guid = System.Guid.NewGuid().ToString("N");
} /// <summary>
/// 调用方法的时候,是单例也没有用,每次调用都会变
/// </summary>
/// <returns></returns>
public string GetName()
{
return System.Guid.NewGuid().ToString("N");
}
}
public class U4 : IU4
{
public string guid { get; set; } public U4()
{
guid = System.Guid.NewGuid().ToString("N");
} /// <summary>
/// 调用方法的时候,是单例也没有用,每次调用都会变
/// </summary>
/// <returns></returns>
public string GetName()
{
return System.Guid.NewGuid().ToString("N");
}
}

2. 核心:

  利用IServiceCollection services这个对象进行注册,而这个对象在Startup类中的ConfigureServices中已经注入进去了, 也就是说我在自定义对象的注册是的时候,可以直接在ConfigureServices类中进行注册,然后在控制器中使用的时候通过构造函数进行注入即可。

PS:我们也可以自己 IServiceCollection container = new ServiceCollection(); 然后进行注册(不推荐,特殊情况下可能这么用)

3. 生命周期分为三种:

  瞬时的(AddTransient)、请求内单例(AddScoped)、单例(AddSingleton 两种写法)。

4. 测试:

  两次访问该页面,发现ViewBag.r1 和 ViewBag.r2两次的值不同,ViewBag.r3和ViewBag.r4两次的值相同。

代码分享:

  public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); //自定义注册对象
{
services.AddTransient<IU1, U1>(); //瞬时的
services.AddScoped<IU2, U2>(); //一次请求内是不变的
services.AddSingleton<IU3, U3>(); //单例的
services.AddSingleton<IU4>(new U4()); //单例的 }
}
   public class FirstController : Controller
{
public IU1 U1 { get; }
public IU1 U11 { get; }
public IU2 U2 { get; }
public IU2 U22 { get; }
public IU3 U3 { get; }
public IU3 U33 { get; }
public IU4 U4 { get; }
public IU4 U44 { get; } public FirstController(IU1 u1, IU1 u11, IU2 u2, IU2 u22, IU3 u3, IU3 u33, IU4 u4, IU4 u44)
{
U1 = u1;
U11 = u11;
U2 = u2;
U22 = u22;
U3 = u3;
U33 = u33;
U4 = u4;
U44 = u44;
} public IActionResult Index()
{
bool a = object.ReferenceEquals(U1, U11);
bool b = object.ReferenceEquals(U2, U22);
bool c = object.ReferenceEquals(U3, U33);
bool d = object.ReferenceEquals(U4, U44); //分两次请求来查看
ViewBag.r1 = U1.guid;
ViewBag.r2 = U2.guid;
ViewBag.r3 = U3.guid;
ViewBag.r4 = U4.guid; //下面是自己创建的的模式进行访问
{
IServiceCollection container = new ServiceCollection();
container.AddTransient<IU2, U2>();
//要放在注册的后面
var provider = container.BuildServiceProvider();
IU2 user1 = provider.GetService<IU2>();
IU2 user2 = provider.GetService<IU2>();
bool cc = object.ReferenceEquals(user1, user2); }
return View();
}
}
 <div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>瞬时的:@ViewBag.r1</p>
<p>请求内单例:@ViewBag.r2</p>
<p>全局单例写法1:@ViewBag.r3</p>
<p>全局单例写法2:@ViewBag.r4</p>
</div>

补充:

  如果不想通过构造函数注入,则可以通过[FromServices]特性来给某个特定方法注入:

       如: public void Test(【FromServices】IU1 u1){    }。

两次访问的请求结果

5. 为什么要用AutoFac进行替换内置容器?

  因为某些特定的功能内置的容器不支持,比如:属性的注入、基于名称的注入、子容器、自定生存期管理、对迟缓初始化的 Func<T> 支持

6. 用AutoFac替换的步骤

(1). 通过Nuget安装AutoFac【4.9.2】和Autofac.Extensions.DependencyInjection【4.4.0】

(2). 改造ConfigureServices中配置容器并返回IServiceProvider,配置代码详见具体类,注入的代码封装到DefaultModule。

         public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); // Add Autofac
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterModule<DefaultModule>();
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return new AutofacServiceProvider(container);
}
DefaultModule代码分享
特别注意:AutoFac的生命周期也有:瞬时的、单次请求内单例的、全局单例的。
   public class DefaultModule: Module
{
protected override void Load(ContainerBuilder builder)
{
//这里就是AutoFac的注入方式,下面采用常规的方式
//详见:https://www.cnblogs.com/yaopengfei/p/9479268.html
//官网:https://autofac.org/ //特别注意:其中很大的一个变化在于,Autofac 原来的一个生命周期InstancePerRequest,将不再有效。正如我们前面所说的,整个request的生命周期被ASP.NET Core管理了,
//所以Autofac的这个将不再有效。我们可以使用 InstancePerLifetimeScope ,同样是有用的,对应了我们ASP.NET Core DI 里面的Scoped。 //瞬时请求(省略InstancePerDependency 也为瞬时)
builder.RegisterType<U1>().As<IU1>().InstancePerDependency();
//单次请求内单例
builder.RegisterType<U2>().As<IU2>().InstancePerLifetimeScope();
//全局单例
builder.RegisterType<U3>().As<IU3>().SingleInstance();
builder.RegisterType<U4>().As<IU4>().SingleInstance(); }
}

(3). 其他都不变,可以继续沿用构造函数注入。

参考文章:

  https://www.cnblogs.com/yaopengfei/p/9479268.html   (.Net 平台下的AutoFac的用法)

  https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第四节:配置的读取、StartUp类、内置依赖注入和扩展改造的更多相关文章

  1. 多态,封装,反射,类内置attr属性,os操作复习

    1.多态 #多态 多态是指对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类 运行时候,多种实现 反应运行时候状态 class H2O: def __init__(self,nam ...

  2. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  3. 开涛spring3(12.2) - 零配置 之 12.2 注解实现Bean依赖注入

    12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入.生命周期回调方法定义等,不能消除XML文件中的Bean元数据定义,且基于XML配置中的依赖注入的 ...

  4. [转]后台页面访问权限:页面基类&内置票据认证 使用方法

    本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户 ...

  5. spring接口多实现类,该依赖注入哪一个?

    一.问题的描述 在实际的系统应用开发中我经常会遇到这样的一类需求,相信大家在工作中也会经常遇到: 同一个系统在多个省份部署. 一个业务在北京是一种实现方式,是基于北京用户的需求. 同样的业务在上海是另 ...

  6. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  7. Python之路【第四篇】: 函数、递归、内置函数

    一. 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 while True: i ...

  8. 利用.net Core 对程序集中的类 进行统一依赖注入

    1.创建特性 用于标注依赖注入 using Microsoft.Extensions.DependencyInjection; using System; using System.Collectio ...

  9. 第四章 函数之lambda 表达式和内置函数

    4.5 lambda 表达式 用于表示简单的函数. # 三元运算,为了解决简单的if else的情况,如:if 1 == 1:    a = 123else:    a = 456# 相当于a = 1 ...

随机推荐

  1. iis url 重写

    1.选择网站-找到有测url 重写 :2:选中它,在右上角有一个打开功能,点击打开 3.依然在右上角,点击添加规则 4:选择第一个,空白规则 名称随便输入,我们通常有这样一个需求,就是.aspx 后缀 ...

  2. Width Height -- (2)

    上回说到,宽高对于块级元素和行内元素发生的改变,结果是块级元素会接受宽高属性所发生的改变的,而行内元素不接受宽高属性所发生的改变. 但是,事无绝对 —— CSS属性display 通过上回进行的测试我 ...

  3. Composer安装laravel框架

    一.打开CMD,进入想安装的目录,输入如下图所示,安装一个blog的项目: 二.进入指定目录即可看到生成的blog项目,如下图:

  4. 十、lambda表达式、内置函数之filter、map、reduce

    lambda表达式   学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 == : name = 'wupeiqi' else: name = 'ale ...

  5. 【JavaScript】案例三:使用JS完成页面定时弹出广告——事件(onload)

     事件(onload) *注意点: 变量加var局部变量,不加var全局变量 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. 返回值:返回 ...

  6. 第07节-开源蓝牙协议BTStack框架代码阅读(上)

    首先来看一下,对于硬件操作,它是如何来进行处理的.在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码.在BTStack中,可以搜索一下main.c,将会发现有很多ma ...

  7. python类定义的讲解

    python是怎么定义类的,看了下面的文章大家就会了,不用多说,开始学习. 一.类定义: 复制代码代码如下: class <类名>: <语句> 类实例化后,可以使用其属性,实际 ...

  8. 25-C#笔记-文件的输入输出

    1. 写txt FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileSh ...

  9. CSV读取

    可以在Excel中编辑好后  另存为CVS文件

  10. jQyery简史和下载引用方法

    1.jQuery简介 jQuery是一个快速,小型且功能丰富的JavaScript库.借助易于使用的API(可在多种浏览器中使用),使HTML文档的遍历和操作,事件处理,动画和Ajax等事情变得更加简 ...