Làm cách nào để định cấu hình Ứng dụng giao diện điều khiển .NET Core 1.0.0 cho tính năng Chèn, ghi nhật ký và cấu hình phụ thuộc?
Rất nhiều nội dung được viết không được chấp nhận sau RC2. (xem issue). Fortunatelly có một số bài viết được cập nhật với thông tin xuất sắc:
Essential .NET - Dependency Injection with .NET Core
Essential .NET - Logging with .NET Core
tôi đã đưa ra các giải pháp sau đây. Tôi đặt cược có những thứ có thể được cải thiện, xin vui lòng để lại ý kiến để tôi có thể cải thiện câu trả lời này.
Trong static void Main
của tôi, tôi
- tiêm cài đặt phụ thuộc
- Gọi
ConfigureServices
- Khởi tạo lớp
Application
tôi sử dụng DI
- Chuyển từ 'đồng bộ chính' thành 'async Application.Run () ' (Điều đó có ý nghĩa với tôi khi chuyển sang async sớm nhất có thể và chỉ một lần.)
On Application
Lớp tôi:
- tôi tiêm càng nhiều càng tốt về các nhà xây dựng lớp.
- Bắt bất kỳ ngoại lệ nào trên phương thức Run().
Đây là mã.
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());
}
}
}
}
File AppSettings.json:
{
"MyOptions": {
"Name" : "John"
}
}
Và project.json
file:
"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",
Về câu hỏi của bạn # 2: Tôi đã đọc các tài liệu và trừ khi tôi đang thiếu cái gì , nó không nói bạn có thể viết cấu hình. Tôi không chắc bạn có thể làm điều đó, trừ khi bạn chỉnh sửa các tệp JSON theo cách thủ công bằng Newtonsoft.JSON.
Nếu cặp tên/giá trị được ghi vào Cấu hình, nó không được duy trì. Điều này có nghĩa là giá trị bằng văn bản sẽ bị mất khi các nguồn được đọc một lần nữa.
Đối với câu hỏi của bạn # 3 Tôi đã bao gồm tệp AppSettings.json mặc định. Cấu hình của bạn nên có Phần nơi cài đặt của nó khớp với tên đối với thuộc tính công khai của lớp cài đặt của bạn.
Bạn nói bạn có câu hỏi, nhưng tôi không thấy bất kỳ câu hỏi nào, chỉ phàn nàn về các ví dụ bị thiếu. Nếu bạn đang yêu cầu những ví dụ đó, thì đó không phải là những gì SO cho. – svick
Tôi có thể tìm thấy bất kỳ ví dụ hoặc tài liệu nào tôi đang tìm kiếm, tôi hy vọng rằng một nhà phát triển khác có thể chỉ cho tôi đúng hướng hoặc chỉ cho tôi một số tài liệu. – codeputer
Microsoft chào đón cộng đồng để viết lên các chủ đề như vậy trên các trang tài liệu của nó cũng như Tài liệu Tràn ngăn xếp. Bạn có thể theo dõi họ hoặc đưa ra yêu cầu ở đó. Một nền tảng di chuyển nhanh như thế này làm cho nó nhàm chán với tài liệu, vì vậy tôi không ngạc nhiên rằng nhiều thứ bị thiếu. –