如何为依赖注入、日志记录和配置配置.NET Core 1.0.0控制台应用程序?
很多旧的内容已经在RC2之后过时了。(见问题).
幸运的是,有一些更新的文章提供了出色的信息:
Essential .NET - 使用.NET Core进行依赖注入
Essential .NET - 使用.NET Core进行日志记录
我想出了以下解决方案。我敢打赌有些可以改进的地方,请留下评论,以便我完善这个答案。
在我的static void Main
中,我:
- 设置依赖注入
- 调用
ConfigureServices
- 使用DI实例化我的
Application
类
- 从同步的
Main
切换到'async Application.Run()'
(对我来说,尽可能快地切换到异步只有一次是有意义的)
在我的Application
类中:
- 在类构造函数中尽可能注入
- 捕获Run()方法的任何异常
以下是代码。
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);
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
var app = serviceProvider.GetService<Application>();
Task.Run(() => app.Run()).Wait();
}
private static void ConfigureServices(IServiceCollection services)
{
ILoggerFactory loggerFactory = new LoggerFactory()
.AddConsole()
.AddDebug();
services.AddSingleton(loggerFactory);
services.AddLogging();
IConfigurationRoot configuration = GetConfiguration();
services.AddSingleton<IConfigurationRoot>(configuration);
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",
关于你的第二个问题:我已经阅读了这份文档,除非我漏看了什么,否则它并没有说你可以编写配置。我不确定除非你使用Newtonsoft.JSON手动编辑JSON文件,否则你是否能够这样做。
如果将名称/值对写入Configuration,则不会持久化该对。这意味着在再次读取源时,写入的值将丢失。
对于你的第三个问题,我已经包含了一个默认的AppSettings.json文件。你的配置应该有一个部分,其中其设置按名称与你的设置类的公共属性相匹配。