从不同项目访问 appsettings.json

Posted

技术标签:

【中文标题】从不同项目访问 appsettings.json【英文标题】:Accessing appsettings.json from different projects 【发布时间】:2018-07-02 13:46:25 【问题描述】:

我正在使用 .Net Core 2.1 创建 Web API。我的解决方案包含不同的项目,并且在 main/startup 项目中有一个 appsettings.json 文件。 我想从不同的项目中读取 appsettings。为此,我在一个公共项目中创建了一个类,并引用了其他所有项目。

namespace Common

    public sealed class ApplicationSettings
    
        public ApplicationSettings(IConfiguration configuration)
        
            InitSettings(configuration);
        

        public string CloudStorageConnectionString  get; private set; 

        private void InitSettings(IConfiguration configuration)
        
            CloudStorageConnectionString = configuration["CloudStorageAccountConnection"];
        
    

然后我尝试在启动项目的Startup类中配置这个-

public Startup(IConfiguration configuration)

    Configuration = configuration;


public IConfiguration Configuration  get; 

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //I can read the AppSettings values here via Configuration..

    var settings = new ApplicationSettings(Configuration);
    services.AddSingleton(settings);

终于用上了-

public class ToolService : IToolService

    private DataContext _dataContext = null;
    private readonly Common.ApplicationSettings _settings;
    public ToolService()
    
        _dataContext = new DataContext();
    

    public ToolService(Common.ApplicationSettings settings)
    
        _settings = settings; //settings is null here
    

    public ToolDetailModel ReadToolDetail(int toolDetailID)
    
        ToolDetailModel toolDetailModel = null;
        try
        
            var cloudConnection = _settings.CloudConnectionString; //settings is null here      
            //...
        
        catch
        

        
        return toolDetailModel;
    

这就是我在主启动项目中的 API 控制器中调用上述函数的方式-

public class ValuesController : ControllerBase

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    
        IToolService _toolService = new ToolService();
        _toolService.ReadToolDetail(1);
        //...
        return new string[]  "value1", "value2" ;
    

AppSettings 对象在我尝试通过将它们作为参数传递(使用如上所示的依赖注入)在不同的项目中使用它们时为空。

我做错了吗?如果我可以添加更多详细信息,请告诉我。

【问题讨论】:

a different project是什么类型的项目?控制台,ASP.NET Core? @SimplyGed 类库项目 【参考方案1】:

您已经为ToolService 定义了两个构造函数,目前您在其他项目中调用了错误的构造函数。您应该修改它,使您只有一个构造函数:

public ToolService(Common.ApplicationSettings settings)

    _dataContext = new DataContext();
    _settings = settings; //settings is null here

如果您希望您的类库使用依赖注入,那么您需要将其注册到 services 集合,例如

public void ConfigureServices(IServiceCollection services)

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    //I can read the AppSettings values here via Configuration..

    var settings = new ApplicationSettings(Configuration);
    services.AddSingleton(settings);

    // use whatever lifetime you prefer
    services.AddScoped<ToolService>();

现在当您尝试调用new ToolService() 时,它会抱怨说您需要提供ApplicationSettings 参数。 问题是如果您使用依赖注入,则不能使用new ToolService()。您需要让依赖注入器为您创建类。对于 ASP.NET Core,即IServiceProvider 接口。

你没有显示你在哪里创建 ToolService 类。如果它在ConfigureServices 中注册的类中,那么您只需将ToolService 作为构造函数参数传递,依赖注入器将为您解析引用,包括ToolService 类想要的ApplicationSettings 参数例如

public class MyClass

    public MyClass(ToolService toolService)
    
        _toolService = toolService;
    

    public void MyMethod()
    
        _toolService.ReadToolDetail(1);
    

【讨论】:

谢谢。我已经编辑了我的帖子。基本上我在我的 API 控制器类中实例化 ToolService。我相信我不能将ToolService 注入我的API 控制器类?你能建议一个更好的方法吗?再次感谢。 您当然可以将ToolService 注入API 控制器:-)。只要您在ConfigureServices 方法中注册了ToolService,您就可以将其注入到任何其他已向IServiceCollection 注册的类中(注意:框架会自动注册控制器) 所以每当我必须访问MyMethod() 时,我必须通过传递ToolService 引用来实例化MyClass 如果您想手动创建类,即使用new MyClass(..),那么可以。 这可能会在一段时间后变得复杂。有没有更简单的方法来访问我所有项目中的应用程序设置?据我了解,作为一种实践,除了启动项目之外,其他项目都不应该直接访问 appsettings.json 。是这样吗?

以上是关于从不同项目访问 appsettings.json的主要内容,如果未能解决你的问题,请参考以下文章

Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包

从不同的类访问私有访问变量数据

如何从不同的方法访问串口数据

从 XCode UI 测试目标访问项目文件

如何从一个 Xcode 项目访问多个 Firebase 数据库

从不同的项目更新 iOS 应用程序,锁定沙箱?