ASPNet.Core 从引用的程序集中读取应用程序设置?

ASPNet.Core reading appsettings from referenced assemblies?

我们正在构建一个 ASPNet.Core 微服务 (HSMService),我们引用了另一个 ASPNet.Core 项目 (HSM) 中的几个程序集。 HSM 程序集需要读取 HSMService 根目录中的 appsettings.json 文件来设置一些值。

在我们对 HSM 项目的单元测试中,appsettings.json 文件位于测试项目的根目录中,我们正在使用 .SetPath(Directory.GetCurrentDirectory()) 读取值。

当我们在 HSMService 中引用 HSM 程序集时它不起作用,它试图从 DLL 所在的 /bin/Debug/netstandard2.0 目录加载。

是否可以从 HSM 程序集中的 HSMService 加载 appsettings.json 文件,或者我们是否应该将值的设置移动到 HSMService 的代码中?我应该把它放在哪里?

我们决定修改程序集以在构造函数中使用一个参数指向 appsettings.json 文件

public class HSMController : Controller
{
    private readonly IHostingEnvironment _hostingEnvironment;
    public string contentRootPath { get; set; }

    public HSMController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
        contentRootPath = _hostingEnvironment.ContentRootPath;
    }

    [Route("/PingHSM")]
    [HttpGet]
    [ProducesResponseType(typeof(ApiResponse), 200)]
    [ProducesResponseType(typeof(ApiResponse), 500)]
    public IActionResult PingHSM()
    {
        IHSM hsm = HSMFactory.GetInstance(contentRootPath);
        return Ok(hsm.PingHSM());
    }
}

HSMFactory 中的构造函数负责获取 contentRootPath 并设置 Config 变量。

public static IHSM GetInstance(string configPath)
{
    // for now, there's only one
    Type t = GetImplements(typeof(IHSM)).FirstOrDefault();
    ConstructorInfo ctor = t.GetConstructor(new Type[] { typeof(string) });// assume empty constructor
    return ctor.Invoke(new object[] { configPath }) as IHSM;
}