故事背景

  一般情况下ASP.Net Core项目配置可以直接在appsetting.json中添加,也可以在项目中添加新的配置文件。但如果想和其他项目一起实现配置文件通用呢?我们可以用绝对定位去访问配置文件,但可能会遇到访问权限之类的问题;我们也可以通过开发配置文件访问接口来实现,但太麻烦了,而且不可能加了一个配置我就去改一次访问代码。那么,官方有木有提供什么方案呢?

  有的,微软官方提供了允许ASP.Net Core承载外部程序集功能,实现逻辑就是通过外部类实现IHostingStartup接口,在启动时从外部程序集向应用添加增强功能。针对我们前面提到的外部项目向ASP.Net Core中添加配置文件需求是如何实现的呢?无非ASP.Net Core在启动时执行启动依赖程序集中指定特性的类中的Configure方法,而在该方法下将需要共享的配置添加到ASP.Net Core运行时中。

基本流程

外部类库程序集
  • 创建类库项目HostingStartupLibrary

  • 打开Nuget管理界面,依次安装Microsoft.AspNetCore.Hosting(2.2.7)Microsoft.Extensions.Configuration(3.0.0)包。

  • 新增承载类ServiceKeyInjection,实现IHostingStartup接口的Configure方法,添加部分数据到内存中。

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration; [assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]
    namespace HostingStartupLibrary
    {
    public class ServiceKeyInjection : IHostingStartup
    {
    var dict = new Dictionary<string, string>()
    {
    {"DevAccount_FromLibrary", "DEV_1111111-1111"}
    }; //配置方法一:主项目配置优先加载,再加载当前配置。
    builder.ConfigureAppConfiguration(config =>
    {
    config.AddInMemoryCollection(dict);
    }); //配置方法二:当前配置优先加载,再加载主项目配置。
    //var builderConfig = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
    //builder.UseConfiguration(builderConfig);
    }
    }
ASP.Net Core主项目
  • 添加对类库项目HostingStartupLibrary的引用,也可以直接引用类库项目编译后的dll文件。
  • 配置主机启动依赖程序集,配置方法有两种:主机配置与环境变量配置。若同时设置了主机配置与环境变量配置,则实际采用主机配置控制。
    • 主机配置

      • 打开Program.cs,找到CreateHostBuilder方法。
      • UseStartup<Startup>()之前,webBuilder之后添加UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostingStartupLibrary"),HostingStartupLibrary即为外部程序集的名称。
    • 环境变量配置

      • 打开launchSettings.json文件;
      • 找到所有的environmentVariables节点,在该节点下面添加ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,值为HostingStartupLibrary,即外部程序集名称。
  • 配置获取测试。
    • 通过构造函数注入,将IConfiguration注入到控制器中。
    • 通过config["DevAccount_FromLibrary"]形式获取配置数据,判断是否正确。

详细解读

ASP.Net Core承载外部程序集的更多相关文章

  1. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  2. 【懒人有道】在asp.net core中实现程序集注入

    前言 在asp.net core中,我巨硬引入了DI容器,我们可以在不使用第三方插件的情况下轻松实现依赖注入.如下代码: // This method gets called by the runti ...

  3. ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (转载)

    阅读目录 在Asp.Net Core 中使用外部登陆(google.微博...) 中间件管道 The Authentication Middleware The Challenge 与认证中间件进行交 ...

  4. asp.net core 中灵活的配置方式

    asp.net core支持外部文件和命令行参数方式来配置系统运行所需要的配置信息,我们从下面两个常用场景来具体说下具体使用方法. 一.监听地址及端口配置 1,命令行方式 asp.net core系统 ...

  5. ASP.NET Core 中文文档 第四章 MVC(3.6.1 )Tag Helpers 介绍

    原文:Introduction to Tag Helpers 作者:Rick Anderson 翻译:刘浩杨 校对:高嵩(Jack) 什么是 Tag Helpers? Tag Helpers 提供了什 ...

  6. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  7. ASP.NET .Core 集成 React SPA 应用

    AgileConfig的UI使用react重写快完成了.上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题.现在使用reac ...

  8. IIS在ASP.NET Core下的两种部署模式

    KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...

  9. ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用

    与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的 ...

随机推荐

  1. DBUtils封装数据库返回对象的各种方法

    ①ArrayHandler:     将查询结果的第一行数据,保存到Object数组中       ②ArrayListHandler     将查询的结果,每一行先封装到Object数组中,然后将数 ...

  2. Hive(七)Hive参数操作和运行方式

    Hive参数操作和运行方式 1.Hive参数操作 1.hive参数介绍 ​ hive当中的参数.变量都是以命名空间开头的,详情如下表所示: 命名空间 读写权限 含义 hiveconf 可读写 hive ...

  3. 【Share Code | HTML & CSS & Javascript】动画片段幻灯片

    [查看demo & 下载资源](https://zhaoshuquan.com/posts/15 介绍 本文使用"Pieces"库轻松实现动画片段幻灯片效果. 今天我们想向 ...

  4. Fetch(原生)的简单使用

    前言: Fetch 提供了对 Request 和 Response 等对象通用的定义. 发送请求或者获取资源,需要使用 fetch() 方法. 具体使用代码: <script> fetch ...

  5. Java-FileUploadUtil工具类

    package com.gootrip.util; import java.io.File; import java.util.*; import org.apache.commons.fileupl ...

  6. javaScript--for循环的性能提升

    //为什么性能提升? //第一种写法每次循环时都需要从内存中取出students.length并判断条件是否成立 //第二种写法只需要取一次students.length就可以 //第二种方式弊端:l ...

  7. 02 Vue介绍与安装,指令系统 v-*、音乐播放器

    VUE文档 https://cn.vuejs.org/v2/guide/ 1.vue的介绍 尤雨溪 1.vue的优点 2.vue的介绍 3.vue的安装 4.声明式渲染 <body> &l ...

  8. 【Java Web】IDEA如何创建及配置Web项目(多图)

    正文之前 在学习Java Web时,第一个遇到的问题就是如何创建或配置Web项目了,今天,就用IntelliJ IDEA 来进行Web项目配置: 创建Web项目 配置web项目 正文 创建Web项目 ...

  9. 深入理解 Java 线程池

    一.简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建 ...

  10. angularJS <input type="file> 图片的base64编码

    talk is cheap show me the code <input type="file" id="file" name="file&q ...