如何爲依賴注入,日誌記錄和配置配置.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文檔中撰寫這些主題。您可以留意他們或在那裏提出要求。像這樣一個快速移動的平臺讓文檔變得無聊,所以我並不感到驚訝,許多事情都缺失了。 –