ASP.NET Core 的 `Core` 有几种写法?
一、概述
本文将会根据情况持续更新。
作为一个 Framework
,ASP.NET Core
提供了诸多的扩展点。使用内置的组件和默认的配置通常就能够满足部分需求,当需要扩展的时就需要先去找出这些扩展点。除了基于实际应用对 ASP.NET Core
进行扩展,也会故意搞一些不切实际的伪需求,解决一些不会存在的问题。这样的目的何在呢?一是为了加深对 ASP.NET Core
的理解,二是难保这些伪需求不会变成真需求。
二、WebHost.CreateDefaultHostBuilder
WebHost.CreateDefaultHostBuilder
静态方法用于创建 WebHostBuilder
对象,它有三个重载:
public static IWebHostBuilder CreateDefaultBuilder();
public static IWebHostBuilder CreateDefaultBuilder(string[] args);
public static IWebHostBuilder CreateDefaultBuilder<TStartup>(string[] args) where TStartup : class;
ASP.NET Core
项目模板使用的是第二个重载。第一个重载其实没多大必要,将第二个重载的 args
参数设置成默认为 null
也可以。使用第三个重载,可以少一次对 UseStartup<T>
的直接调用。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder<Startup>(args);
备注:
CreateDefaultBuilder
不能满足需求时,可自行通过new
创建WebHostBuilder
。比如CreateDefaultBuilder
在创建WebHostBuidler
调用了后者的UseDefaultServiceProvider
扩展方法会导致使用默认的DefaultServiceProviderFactory
,从而导致使用默认DI
容器( ServiceProvider ),虽然之后可以替换成Autofac
之类的,但可以控制直接使用而不是替换。
三、IWebHostBuilder.UseStartup
IWebHostBuilder.UseStartup
扩展方法用于使用 Startup
,它有两个重载:
public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, Type startupType);
public static IWebHostBuilder UseStartup<TStartup>(this IWebHostBuilder hostBuilder) where TStartup : class;
ASP.NET Core
项目模板使用的是第二个重载,即泛型版本。泛型版本内部实际上调用的是非泛型版本。如果 Startup
不是定义在 ASP.NET Core Web
项目而是另一个程序集中,可先通过反射获取 Startup
的类型,然后调用非泛型版本。当然,通过反射来调用泛型版本也是可以的,但想不出这样做的理由。
备注:
Startup
会被注册为单例,多次调用UseStartup
只有最后一个有效。
应用名称默认是Startup
类所在程序集的名称,如果将Startup
类放在另一个程序集中,需要留意这一点。
如果不使用 Startup
类,不注册服务,只配置中间件的话,可以使用 IWebHostBuilder.Configure
扩展方法:
public static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder, Action<IApplicationBuilder> configureApp);
备注:
Configure
看似是添加中间件的方法,其实不然。
四、使用第三方依赖注入
在 Startup
中替换依赖注入容器,以 Autofac
为例。第一种是实现 ConfigureContainer
方法:
// ConfigureContainer is where you can register things directly
// with Autofac. This runs after ConfigureServices so the things
// here will override registrations made in ConfigureServices.
// Don't build the container; that gets done for you. If you
// need a reference to the container, you need to use the
// "Without ConfigureContainer" mechanism shown later.
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModule());
}
第二种是实现 ConfigureServices
方法:
// ConfigureServices is where you register dependencies. This gets
// called by the runtime before the Configure method, below.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add services to the collection.
services.AddMvc();
// Create the container builder.
var builder = new ContainerBuilder();
// Register dependencies, populate the services from
// the collection, and build the container.
//
// Note that Populate is basically a foreach to add things
// into Autofac that are in the collection. If you register
// things in Autofac BEFORE Populate then the stuff in the
// ServiceCollection can override those things; if you register
// AFTER Populate those registrations can override things
// in the ServiceCollection. Mix and match as needed.
builder.Populate(services);
builder.RegisterType<MyType>().As<IMyType>();
this.ApplicationContainer = builder.Build();
// Create the IServiceProvider based on the container.
return new AutofacServiceProvider(this.ApplicationContainer);
}
第三种方法是采用自定义 IServiceProviderFactory
的方式,比如 Abp
:
public static class AbpAutofacAbpApplicationCreationOptionsExtensions
{
public static void UseAutofac(this AbpApplicationCreationOptions options)
{
ContainerBuilder builder = new ContainerBuilder();
options.Services.AddObjectAccessor<ContainerBuilder>(builder);
options.Services.AddSingleton<IServiceProviderFactory<ContainerBuilder>>((IServiceProviderFactory<ContainerBuilder>) new AbpAutofacServiceProviderFactory(builder));
}
}
备注:对于第三种方法,不用陷入先有鸡还是先有蛋的困境,
WebHostBuilder
的Build
方法会创建一个HostingServiceProvider
。
五、服务注册点
包含名为 ConfigureServices
或类似的方法的接口和类:
类/接口 | 程序集 | 命名空间 | 备注 |
---|---|---|---|
IStartup | Microsoft.AspNetCore.Hosting.Abstractions | Microsoft.AspNetCore.Hosting | 接口。 实现类定义于应用。 配合 IWebHostBuilder.UseStartup 方法。 |
Startup | 自定义 | 自定义 | 定义于应用。不继承任何接口或类,实现 Configure 和 ConfigureServices 等方法。 配合 IWebHostBuilder.UseStartup 方法。 |
IWebHostBuilder | Microsoft.AspNetCore.Hosting.Abstractions | Microsoft.AspNetCore.Hosting | 接口。 |
WebHostBuilder : IWebHostBuilder | Microsoft.AspNetCore.Hosting | Microsoft.AspNetCore.Hosting | ConfigureServices 不会进行实际的服务注册操作,当调用 Build 方法时才注册。 |
六、中间件注册点
包含名为 Configure
或类似方法的接口和类:
类/接口 | 程序集 | 命名空间 | 备注 |
---|---|---|---|
IStartup | Microsoft.AspNetCore.Hosting.Abstractions | Microsoft.AspNetCore.Hosting | 接口。实现类定义于应用。 配合 IWebHostBuilder.UseStartup 方法。 |
IHostingStartup | Microsoft.AspNetCore.Hosting.Abstractions | Microsoft.AspNetCore.Hosting | 接口。 |
Startup | 自定义 | 自定义 | 定义于应用。不继承任何接口或类,实现 Configure 和 ConfigureServices 等方法。 配合 IWebHostBuilder.UseStartup 方法。 |
IStartupFilter | Microsoft.AspNetCore.Hosting.Abstractions | Microsoft.AspNetCore.Hosting | 接口。实现类定义于应用。需注册为服务。 |
参考资料
ASP.NET Core 中的应用启动
在 ASP.NET Core 中使用 IHostingStartup 从外部程序集增强应用
Autofac 集成 ASP.NET Core
Abp 依赖注入
ASP.NET Core 的扩展点
ASP.NET Core 的 `Core` 有几种写法?的更多相关文章
- Asp.Net调用后台变量的三种写法
1.Asp.Net中几种相似的标记符号: < %=...%>< %#... %>< % %>< %@ %>解释及用法 答: < %#... %&g ...
- ASP.Net Core下Authorization的几种方式 - 简书
原文:ASP.Net Core下Authorization的几种方式 - 简书 ASP.Net Core下Authorization的几种方式 Authorization其目标就是验证Http请求能否 ...
- .net core 注入中的三种模式:Singleton、Scoped 和 Transient
从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...
- asp.net core+ef core
asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一 ...
- Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)
Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本) 原创 2016年07月22日 10:33:51 23125 6月随着.NET COR ...
- 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作
专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...
- [.NET Core].NET Core R2安装教程及Hello示例
前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core.由于各种原因,就没有初试.刚好,前几天看到.NET Core发布新版本了,决定 ...
- .net core EF Core 视图的应用
由之前的一篇文章<.net core Entity Framework 与 EF Core>我们都已经知道 EF Core 增加了许多特性,并且性能上也有了很大的提升. 但是EF Core ...
- .net core EF Core 调用存储过程
在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...
- asp.net跳转页面的三种方法比较
目前,对于学习asp.net的很多朋友来讲,实现跳转页面的方法还不是很了解.本文将为朋友们介绍利用asp.net跳转页面的三种方法,并对其之间的形式进行比较,希望能够对朋友们有所帮助. ASP.NET ...
随机推荐
- 第一篇-生成可运行得exe文件
1. 项目 --> 属性 2. 配置 -->Release 3. 如果可以在其他电脑运行可以不进行下面的,如果不能运行,选择代码生成-->运行库-->MT 4. 完成上述步骤后 ...
- 实现select联动效果,数据从后台获取
效果如下: 当type值选择完后,amount值会自动相应填入. 1. 从后台获取数据,为一个数组,里面包含多个对象. <select id="scholarshipTypeSelec ...
- Guest Editors’ Introduction: Special Issue on Advances in Management of Softwarized Networks
文章名称:Guest Editors’ Introduction:Special Issue on Advances in Management of Softwarized Networks 发表时 ...
- c语言变量及输入输出
scanf: 格式字符串的一般形式:%[*][输入数据宽度][长度] 类型 (其中有方括号[] 的项为任选项.) 各项意义: 1) 类型:表示输入数据的类型,其格式符和意义如下表所示. ...
- CentOS7自定义系统服务示例
CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/ ...
- PostgreSql sql shell win10 下乱码解决
重现步骤: 打开 SQL Shell (psql) Server [localhost]: Database [postgres]: Port ]: Username [postgres]: psql ...
- seajs使用方法
必须执行seajs.use()时,才能自动执行预加载项 <script src="/UILib/sea.js"></script> <script s ...
- eclipse出现jdk版本更新导致无法启动
启动出现的问题,截图: 解决办法: 1.找到自己jdk安装的bin目录,我的安装目录是:F:\jdk\bin 2.修改eclipse安装目录下的eclipse.ini,添加 -vmF:\jdk\bin ...
- 415 DOM 查找列表框、下拉菜单控件、对表格元素/表单控件进行增删改操作、创建元素并且复制节点与删除、 对表格操作、通用性和标准的事件监听方法(点击后弹窗效果以及去掉效果)
DOM访问列表框.下拉菜单的常用属性: form.length.options.selectedindex.type 使用options[index]返回具体选项所对应的常用属性:defa ...
- c++ 常用头文件
1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...