故事背景

  一般情况下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. 版本控制工具 svn 二

    一.图标 忽略图标 实例 二.版本 回滚 tortoisesvn ——> 版本更新——>一般情况下使用 “显示日子” 回滚 三.版本冲突 版本冲突产生原因 多人先后提交文件,每个人提交的文 ...

  2. python 3.4.3 安装pygame

    之前一直都是用的python3.5,后来接触了pygame,又被python3.5的打包折磨的死去活来,后来干脆用python 3.4.3. 我之前安装轮子都是直接打开cmd,然后 pip3 inst ...

  3. zencart重置用户登录密码sql

    zencart重置用户ID为99的登录密码为aaaaaaa ;

  4. PAT乙级1015

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312 题解 思路比较简单,核心就是定义一 ...

  5. zeus部署

    1.下载zeus 阿里在github上已经不维护zeus了,在网上找到一个别人贡献的 https://github.com/michael8335/zeus2 下载下来 通过shell rz命令上传到 ...

  6. ubuntu下mysql的用户添加、授权、取消授权

    一.添加用户 新增用户会有两种方式的,一种是使用create命令,另一种是直接回使用grant 命令 create user 名字@登陆地址 identified by "密码"; ...

  7. CSS——字体大小最常用的单位

    px (像素): 将像素的值赋予给你的文本.这是一个绝对单位, 它导致了在任何情况下,页面上的文本所计算出来的像素值都是一样的. ems: 1em 等于我们设计的当前元素的父元素上设置的字体大小 (更 ...

  8. linux 远程配置docker加速器

    https://www.jianshu.com/p/dca49964af04 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh ...

  9. tensorflow2.0编程规范

    背景 tensorflow2.0 相比于1.0 有很大变化,1.0版本的placeholder,Session都没有了,2.0版本强推使用keras.keras是一个比较高层的api,确实挺好用的,一 ...

  10. kubernetes 创建超级管理员和密匙

    # 创建一个超级管理员adm_account="k8s-dash-admin"kubectl create serviceaccount ${adm_account} -n kub ...