故事背景

  一般情况下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. 《python解释器源码剖析》第4章--python中的list对象

    4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...

  2. python常用模块:pickle、shelve、json、xml、configparser

    今日内容主要有: 一.pickle模块二.shelve模块三.json模块四.json练习五.xml模块 六.xml练习七.configparser模块 一.pickle模块 #pickle是一个用来 ...

  3. [ZOJ 3063] Draw Something Cheat

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4706 思路:字符串是一个集合(由0到多个A~Z字符组成),我们可以假 ...

  4. 【input】标签去除默认样式

    input{-webkit-appearance: none; -moz-appearance: none; -o-appearance: none; appearance: none;}

  5. 如何阻止<a>标签默认行为和表单提交

    阻止<a>标签默认行为 方式一 (通过return false) <!DOCTYPE html> <html> <head> <meta char ...

  6. react 项目 mock数据

    前言 我们都知道在实际的开发阶段,后端接口开发是和前端开发同步进行,甚至迟于前端的进度,这就直就导致前端需要等待后端接口的时间. 这种情况就严重导致前端开发缓慢,那这时候前端的开发人员只能写静态模拟数 ...

  7. 【计算机-虚拟wifi】Win7虚拟wifi设置

    虚拟Wifi,可以让电脑变成无线路由器,实现共享上网.   设置步骤 1.以管理员身份运行:cmd.exe   2.启动并设置虚拟网卡:   命令窗口中输入:  netsh wlan set host ...

  8. [人物存档]【AI少女】【捏脸数据】魔幻世界

    人物+衣物.zip

  9. 《剑指offer》算法题第六天

    今日题目: 顺时针打印矩阵 包含min函数的栈 栈的压入.弹出序列 从上到下打印二叉树 二叉树搜索树的后序遍历序列 二叉树中和为某一值的路径 今天的题目都比较简单,下面一一介绍: 1. 顺时针打印矩阵 ...

  10. linux下su设置无密码模式

    1.首先切换到root用户下 2.进到etc目录  cd /etc 3. 修改文件的权限   chmod u+w /etc/sudoers 4. 修改文件   vim  /etc/sudoers