一、概述

本文将会根据情况持续更新。

作为一个 FrameworkASP.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));
}
}

备注:对于第三种方法,不用陷入先有鸡还是先有蛋的困境,WebHostBuilderBuild 方法会创建一个 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` 有几种写法?的更多相关文章

  1. Asp.Net调用后台变量的三种写法

    1.Asp.Net中几种相似的标记符号: < %=...%>< %#... %>< % %>< %@ %>解释及用法 答: < %#... %&g ...

  2. ASP.Net Core下Authorization的几种方式 - 简书

    原文:ASP.Net Core下Authorization的几种方式 - 简书 ASP.Net Core下Authorization的几种方式 Authorization其目标就是验证Http请求能否 ...

  3. .net core 注入中的三种模式:Singleton、Scoped 和 Transient

    从上篇内容不如题的文章<.net core 并发下的线程安全问题>扩展认识.net core注入中的三种模式:Singleton.Scoped 和 Transient 我们都知道在 Sta ...

  4. asp.net core+ef core

    asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一 ...

  5. Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)

    Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本) 原创 2016年07月22日 10:33:51 23125 6月随着.NET COR ...

  6. 国产化之路-统信UOS + Nginx + Asp.Net MVC + EF Core 3.1 + 达梦DM8实现简单增删改查操作

    专题目录 国产化之路-统信UOS操作系统安装 国产化之路-国产操作系统安装.net core 3.1 sdk 国产化之路-安装WEB服务器 国产化之路-安装达梦DM8数据库 国产化之路-统信UOS + ...

  7. [.NET Core].NET Core R2安装教程及Hello示例

    前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core.由于各种原因,就没有初试.刚好,前几天看到.NET Core发布新版本了,决定 ...

  8. .net core EF Core 视图的应用

    由之前的一篇文章<.net core Entity Framework 与 EF Core>我们都已经知道 EF Core 增加了许多特性,并且性能上也有了很大的提升. 但是EF Core ...

  9. .net core EF Core 调用存储过程

    在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...

  10. asp.net跳转页面的三种方法比较

    目前,对于学习asp.net的很多朋友来讲,实现跳转页面的方法还不是很了解.本文将为朋友们介绍利用asp.net跳转页面的三种方法,并对其之间的形式进行比较,希望能够对朋友们有所帮助. ASP.NET ...

随机推荐

  1. Logstash处理json格式日志文件的三种方法

    假设日志文件中的每一行记录格式为json的,如: {"Method":"JSAPI.JSTicket","Message":"JS ...

  2. noi.ac89A 电梯

    题目 思路 首先按照\(t\)排序!!!! 首先考虑一个暴力\(dp\) 用\(f[i]\)表示前\(i\)个人到达地点所需要的时间. 那么就有如下的转移 \[f_i = min_{1 \le j \ ...

  3. APP 后台学习笔记

    1.APP后台功能: 远程存储数据.消息中转 2.架构是业务驱动,可能随着开发进程而变化,没有最完美架构 3.架构不要满足追求技术新奇酷炫,而是结合具体业务使用合适的技术,否则会给运维带来很多不必要的 ...

  4. 论decltype和auto的区别

    论decltype和auto的区别   decltype和auto的区别 ①对引用变量的不同之处:auto将引用变量赋给变量后,变量的类型为引用变量所对应的变量的类型.而decltype则是为引用类型 ...

  5. (双指针 二分) leetcode 167. Two Sum II - Input array is sorted

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  6. redis3.2.10单实例安装测试

    redis3.2.10单实例安装测试 主要是实际使用环境中使用,为了方便快速部署,特意记录如下: # root用户 yum -y install make gcc-c++ cmake bison-de ...

  7. codeforces-1131 (div2)

    A.把右上角的凹缺口补上变成凸的就成了规则矩形 #include <map> #include <set> #include <ctime> #include &l ...

  8. Python菜鸟快乐游戏编程_pygame(1)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

  9. JDK环境部署

    JDK环境部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说起JDK想必大家并不陌生,作为运维的小伙伴,谁不层接触过Java程序员呢?而且在搭建服务上时也必须得接触他,比如to ...

  10. sql0001

    001.   https://blog.csdn.net/qinshi965273101/article/details/81907658 002.    https://blog.csdn.net/ ...