.Net Core/控制台应用程序/配置/XML
.Net Core / Console Application / Configuration / XML
我第一次使用新的 ConfigurationBuilder 和 Options 模式进入 .Net Core 库。
这里有很多很好的例子:https://docs.asp.net/en/latest/fundamentals/configuration.html
以及示例的良好副本 here
项目 1。它说这可以用于非 MVC 应用程序,但没有关于如何在没有 MVC 的情况下使用它的示例 - 特别是如果您使用自定义的强类型 class。 我想看一个使用控制台应用程序显示 DependencyInjection、配置和日志记录设置的示例。
项目 2。它说您可以写回,但没有关于如何将任何更改保存回文件存储的示例或文档。 我想看一个示例,说明如何使用强类型 class 将持久性更改回配置。 Json 或 XML?
项目 3。所有示例都需要手动轰炸初始文件 - 希望看到一个示例,其中初始 json/xml 文件是从强类型 class(当应用程序有很多参数时派上用场)。
如果我能在这上面花足够的时间(而不是重新post文档中已有的示例),我会这样做! 如果您知道 post/documentation 对我有帮助,我将不胜感激。
如何为依赖注入、日志记录和配置配置 .NET Core 1.0.0 控制台应用程序?
很多写的东西在 RC2 之后被弃用了。 (参见 issue)。
幸运的是,有一些更新的帖子提供了很好的信息:
Essential .NET - Dependency Injection with .NET Core
Essential .NET - Logging with .NET Core
我想到了以下解决方案。我敢打赌有些事情可以改进,请发表评论,以便我改进这个答案。
在我的static void Main
中,我
- 设置依赖注入
- 调用
ConfigureServices
- 使用 DI
实例化我的 Application
class
- 从 'sync Main' 切换到 'async Application.Run()'
(对我来说,尽快切换到异步是有意义的,而且只切换一次。)
我的 Application
Class:
- 我在 class 构造函数上注入了尽可能多的东西。
- 捕捉 运行() 方法的任何异常。
这是代码。
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Configuration;
using System.IO;
public class Program
{
static void Main(string[] args)
{
IServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
// Application application = new Application(serviceCollection);
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
var app = serviceProvider.GetService<Application>();
// For async
Task.Run(() => app.Run()).Wait(); // Exceptions thrown here will be lost! Catch them all at Run()
// Otherwise use sync as in: app.Run();
}
private static void ConfigureServices(IServiceCollection services)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole()
.AddDebug();
services.AddSingleton(loggerFactory); // Add first my already configured instance
services.AddLogging(); // Allow ILogger<T>
IConfigurationRoot configuration = GetConfiguration();
services.AddSingleton<IConfigurationRoot>(configuration);
// Support typed Options
services.AddOptions();
services.Configure<MyOptions>(configuration.GetSection("MyOptions"));
services.AddTransient<Application>();
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: true)
.Build();
}
}
public class MyOptions
{
public string Name { get; set; }
}
public class Application
{
ILogger _logger;
MyOptions _settings;
public Application(ILogger<Application> logger, IOptions<MyOptions> settings)
{
_logger = logger;
_settings = settings.Value;
}
public async Task Run()
{
try
{
_logger.LogInformation($"This is a console application for {_settings.Name}");
}
catch (Exception ex)
{
_logger.LogError(ex.ToString());
}
}
}
}
AppSettings.json 文件:
{
"MyOptions": {
"Name" : "John"
}
}
和 project.json
文件:
"dependencies": {
"Microsoft.Extensions.Configuration": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.DependencyInjection": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options": "1.0.0",
"Microsoft.Extensions.PlatformAbstractions": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
关于你的问题#2:我已经阅读了文档,除非我遗漏了什么,否则它并没有说你可以编写配置。我不确定您是否可以这样做,除非您使用 Newtonsoft.JSON.
手动编辑 JSON 文件
If a
name/value pair is written to Configuration, it is not persisted. This
means that the written value will be lost when the sources are read
again.
对于您的问题 #3,我包含了一个默认的 AppSettings.json 文件。您的配置应该有一个部分,其中其设置按名称与您的设置 class.
的 public 属性相匹配
我第一次使用新的 ConfigurationBuilder 和 Options 模式进入 .Net Core 库。
这里有很多很好的例子:https://docs.asp.net/en/latest/fundamentals/configuration.html 以及示例的良好副本 here
项目 1。它说这可以用于非 MVC 应用程序,但没有关于如何在没有 MVC 的情况下使用它的示例 - 特别是如果您使用自定义的强类型 class。 我想看一个使用控制台应用程序显示 DependencyInjection、配置和日志记录设置的示例。
项目 2。它说您可以写回,但没有关于如何将任何更改保存回文件存储的示例或文档。 我想看一个示例,说明如何使用强类型 class 将持久性更改回配置。 Json 或 XML?
项目 3。所有示例都需要手动轰炸初始文件 - 希望看到一个示例,其中初始 json/xml 文件是从强类型 class(当应用程序有很多参数时派上用场)。
如果我能在这上面花足够的时间(而不是重新post文档中已有的示例),我会这样做! 如果您知道 post/documentation 对我有帮助,我将不胜感激。
如何为依赖注入、日志记录和配置配置 .NET Core 1.0.0 控制台应用程序?
很多写的东西在 RC2 之后被弃用了。 (参见 issue)。 幸运的是,有一些更新的帖子提供了很好的信息:
Essential .NET - Dependency Injection with .NET Core
Essential .NET - Logging with .NET Core
我想到了以下解决方案。我敢打赌有些事情可以改进,请发表评论,以便我改进这个答案。
在我的static void Main
中,我
- 设置依赖注入
- 调用
ConfigureServices
- 使用 DI 实例化我的
- 从 'sync Main' 切换到 'async Application.Run()' (对我来说,尽快切换到异步是有意义的,而且只切换一次。)
Application
class
我的 Application
Class:
- 我在 class 构造函数上注入了尽可能多的东西。
- 捕捉 运行() 方法的任何异常。
这是代码。
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Configuration;
using System.IO;
public class Program
{
static void Main(string[] args)
{
IServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
// Application application = new Application(serviceCollection);
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
var app = serviceProvider.GetService<Application>();
// For async
Task.Run(() => app.Run()).Wait(); // Exceptions thrown here will be lost! Catch them all at Run()
// Otherwise use sync as in: app.Run();
}
private static void ConfigureServices(IServiceCollection services)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole()
.AddDebug();
services.AddSingleton(loggerFactory); // Add first my already configured instance
services.AddLogging(); // Allow ILogger<T>
IConfigurationRoot configuration = GetConfiguration();
services.AddSingleton<IConfigurationRoot>(configuration);
// Support typed Options
services.AddOptions();
services.Configure<MyOptions>(configuration.GetSection("MyOptions"));
services.AddTransient<Application>();
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: true)
.Build();
}
}
public class MyOptions
{
public string Name { get; set; }
}
public class Application
{
ILogger _logger;
MyOptions _settings;
public Application(ILogger<Application> logger, IOptions<MyOptions> settings)
{
_logger = logger;
_settings = settings.Value;
}
public async Task Run()
{
try
{
_logger.LogInformation($"This is a console application for {_settings.Name}");
}
catch (Exception ex)
{
_logger.LogError(ex.ToString());
}
}
}
}
AppSettings.json 文件:
{
"MyOptions": {
"Name" : "John"
}
}
和 project.json
文件:
"dependencies": {
"Microsoft.Extensions.Configuration": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.DependencyInjection": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options": "1.0.0",
"Microsoft.Extensions.PlatformAbstractions": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
关于你的问题#2:我已经阅读了文档,除非我遗漏了什么,否则它并没有说你可以编写配置。我不确定您是否可以这样做,除非您使用 Newtonsoft.JSON.
手动编辑 JSON 文件If a name/value pair is written to Configuration, it is not persisted. This means that the written value will be lost when the sources are read again.
对于您的问题 #3,我包含了一个默认的 AppSettings.json 文件。您的配置应该有一个部分,其中其设置按名称与您的设置 class.
的 public 属性相匹配