.NET Core 1.0.0コンソールアプリケーションを依存性注入、ログおよび構成用に構成するにはどうすればよいですか。
書き込まれた内容の多くはRC2の後に非難されています。 (issue参照)。 はFortunatelly優秀情報といくつかの更新の記事があります。
Essential .NET - Dependency Injection with .NET Core
Essential .NET - Logging with .NET Core
私は、次の解決策を考え出しました。改善できる点があると思いますので、この回答を改善できるようコメントを残してください。私static void Main
で
、I
- セットアップ依存性の注入
- 起動
ConfigureServices
- は "非同期 Application.Run(への '同期メイン' からDI
- スイッチを使用して、私の
Application
クラスをインスタンス化) ' (できるだけ早く非同期に切り替えるのは1回だけです) 私
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
ファイル:あなたの質問#2の
"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ファイルが含まれています。あなたの設定には、その設定が設定クラスのパブリックプロパティに名前で一致するセクションが必要です。
あなたはあなたに質問があると言いますが、質問はありません。不足している例についてのみ不平を言います。あなたがそれらの例を求めているなら、それはSOのためではありません。 – svick
私が探しているサンプルやドキュメントを見つけることができます。別の開発者が私に正しい方向を向けることができると願っています。 – codeputer
マイクロソフトでは、このドキュメントのサイトやスタックオーバーフローのドキュメントにこのようなトピックを書き込むことをコミュニティに歓迎しています。あなたはそれらを見守ったり、そこでリクエストをしたりするかもしれません。このように速く動くプラットフォームは、それを退屈なものにするので、多くのことが欠落していることに驚くことはありません。 –