如何为依赖注入,日志记录和配置配置.NET Core 1.0.0控制台应用程序?
很多写的内容在RC2之后弃用。 (见issue)。 Fortunatelly有一些更新的帖子与外观极好信息:
Essential .NET - Dependency Injection with .NET Core
Essential .NET - Logging with .NET Core
我想出了以下解决方案。我敢打赌,有些事情可以改进,请留下评论,以便我可以改进这个答案。
以我static void Main
,我
- 设置依赖注入使用DI
- 调用
ConfigureServices
- 实例化我
Application
类 从 '同步主'
- 转为“异步 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);
// 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文件。
如果一个 名称/值对写入配置,它不会持久。这 意味着当再次读取源 时,写入的值将会丢失。
对于你的问题#3我已经包含了一个默认的AppSettings.json文件。你的配置应该有一个部分,其设置的名称与设置类的公共属性相匹配。
你说你有问题,但我没有看到任何问题,只抱怨缺失的例子。如果你要求这些例子,那么这不是什么意思。 – svick
我可以找到任何我想要的示例或文档,我希望另一位开发人员能够指引我正确的方向,或者指向我一些文档。 – codeputer
Microsoft欢迎社区在其文档站点以及Stack Overflow文档中撰写这些主题。您可以留意他们或在那里提出要求。像这样一个快速移动的平台让文档变得无聊,所以我并不感到惊讶,许多事情都缺失了。 –