C# 什么';这是从主应用程序注入Appsettings.json的正确流程,以及如何做到这一点

C# 什么';这是从主应用程序注入Appsettings.json的正确流程,以及如何做到这一点,c#,.net,dependency-injection,C#,.net,Dependency Injection,我的主要.net核心应用程序名为AppOne。在appsettings.json中,我定义了它应该能够调用的api。例如: "ApiSettings": { "UrlToCall": "http://test", } 然后是我的中间和共享项目库,名为InfraApp,它自己调用Api。 可能还有另一个名为AppTwo的应用程序,其中url不同。 AppOne和AppTwo都引用了InfraApp,因为逻辑是通用的,在那里调用代码以进行实际调用。但是,设置(指定要调用的url)是特定于api本身

我的主要.net核心应用程序名为AppOne。在appsettings.json中,我定义了它应该能够调用的api。例如:

"ApiSettings": {
"UrlToCall": "http://test",
}
然后是我的中间和共享项目库,名为InfraApp,它自己调用Api。 可能还有另一个名为AppTwo的应用程序,其中url不同。 AppOneAppTwo都引用了InfraApp,因为逻辑是通用的,在那里调用代码以进行实际调用。但是,设置(指定要调用的url)是特定于api本身的,因此不能在InfraApp中指定

我们只考虑<强> APONN<强>。 这些设置通过选项模式()注册到startup.cs中:

services.AddOptions();
var apiSettings = Configuration.GetSection("ApiSettings");
services.Configure<ApiSettings>(apiSettings);

将这些API设置传递到InfraApp的正确方法是什么InfraApp对ApiSettings一无所知,因为ApiSettings是在AppOne中定义的。我是否应该将ApiSettings类定义到InfraApp中?IMHO听起来是错误的,因为它是关于AppOneapi的特定内容,但可能我的想法是错误的。谢谢

我想,如果你有这样的东西:

    public interface IApiSettings
        {
            string UrlToCall { get; set; }
        }
        public class ApiSettings:IApiSettings
        {
            public string UrlToCall { get; set; }
            public ApiSettings()
            {
                    ...
                Console.WriteLine($"ApiSettings");
                        ...
            }
        }

        public class IInfraApp{}

        public class InfraApp : IInfraApp
        {
            private IApiSettings _ApiSettings;
            //using Microsoft.Extensions.Options:
            public InfraApp(IOptions<ApiSettings> settings)
            {
                _ApiSettings = (IApiSettings)settings.Value;
                Console.WriteLine($"InfraApp {_ApiSettings.UrlToCall}");
            }
        }
公共接口IApiSettings
{
字符串UrlToCall{get;set;}
}
公共类ApiSettings:IApiSettings
{
公共字符串UrlToCall{get;set;}
公共设置()
{
...
Console.WriteLine($“ApiSettings”);
...
}
}
公共类IInfraApp{}
公共类应用程序:IInfraApp
{
私人IApiSettings_APISTINGS;
//使用Microsoft.Extensions.Options:
公共InfraApp(IOPS设置)
{
_ApiSettings=(IApiSettings)settings.Value;
Console.WriteLine($“InfraApp{{u ApiSettings.UrlToCall}”);
}
}
然后,您可以添加/注册以下内容:

    public void ConfigureServices(IServiceCollection services)
    {
            services.AddControllers();
            ...
            ...
            //
            services.Configure<ApiSettings>(Configuration);
            services.AddTransient<IInfraApp, InfraApp>();
            ...
            ...
            //get instance of infraapp:
            var provider = services.BuildServiceProvider();
            var infraapp = provider.GetService<IInfraApp>();
            //
            ...
            ...
    }
public void配置服务(IServiceCollection服务)
{
services.AddControllers();
...
...
//
服务。配置(配置);
services.AddTransient();
...
...
//获取infraapp的实例:
var provider=services.BuildServiceProvider();
var infraapp=provider.GetService();
//
...
...
}

您需要查看您的设计选择。目前的解释仍不清楚。
InfraApp
希望如何使用运行时设置详细信息?不,我同意你的观点,我只需要了解以非强类型的方式将设置从一个项目注入到另一个项目的正确方式是什么,没有关于你的设计的更多详细信息,回答这个问题太宽泛了。
    public void ConfigureServices(IServiceCollection services)
    {
            services.AddControllers();
            ...
            ...
            //
            services.Configure<ApiSettings>(Configuration);
            services.AddTransient<IInfraApp, InfraApp>();
            ...
            ...
            //get instance of infraapp:
            var provider = services.BuildServiceProvider();
            var infraapp = provider.GetService<IInfraApp>();
            //
            ...
            ...
    }