从不同项目访问 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 包