2016-08-01 22 views
9

Liên kết nhỏ đầu tiên của tôi vào thư viện .Net Core bằng cách sử dụng ConfigurationBuilder mới và mẫu Tùy chọn..Net Core/Console Applicatin/Cấu hình/XML

lô của các ví dụ tốt ở đây: https://docs.asp.net/en/latest/fundamentals/configuration.html và một bản sao tốt của ví dụ here

Khoản 1. nó nói điều này có thể được sử dụng với các ứng dụng phi MVC, nhưng không có ví dụ về cách sử dụng nó mà không MVC - đặc biệt nếu bạn đang sử dụng lớp tùy chỉnh, được đánh máy mạnh mẽ. Tôi muốn xem ví dụ về cách hiển thị thiết lập DependencyInjection, Configuration và Logging bằng ứng dụng Console.

Mục 2. nó cho biết bạn có thể viết lại, nhưng không có ví dụ hoặc tài liệu nào về cách tồn tại bất kỳ thay đổi nào đối với lưu trữ tệp. Tôi muốn xem ví dụ về cách sự thay đổi liên tục trở lại cấu hình bằng cách sử dụng một lớp được đánh máy mạnh mẽ. Trong cả Json hoặc XML?

mục 3. tất cả các ví dụ cần một bàn tay ném bom tập tin ban đầu - muốn xem một ví dụ nơi tệp json/xml ban đầu được tạo ra từ một lớp mạnh mẽ-gõ (có ích khi có nhiều thông số cho ứng dụng).

Nếu tôi có thể dành đủ thời gian cho việc này (thay vì đăng lại một ví dụ đã có trong tài liệu) Tôi sẽ làm điều đó! Nếu bạn biết một bài viết/tài liệu sẽ giúp tôi, tôi sẽ đánh giá cao nó.

+0

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

+0

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

+0

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. –

Trả lời

19

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" 
    } 
} 

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.

+0

Điều thực sự bị thiếu trong liên kết Article, là các câu lệnh Using (và các gói NuGet liên quan cần thiết) để truy cập vào các phương thức mở rộng. Bài học kinh nghiệm - hãy cảnh giác với các phương pháp mở rộng trong .Net core! – codeputer

+0

Vẫn đang chiến đấu với việc đọc từ một tệp XML, trái ngược với JSON. Ryan Crawford đã tweet cho tôi để bao gồm .Extention.Configuration.XML, nhưng tôi nhận được ngoại lệ UTF-16 (không thể chuyển đổi?). – codeputer

+0

wow Tôi không thấy UTF-16 trong một thời gian ... Những điều cần kiểm tra là mã hóa tệp văn bản của bạn (trên notepad: lưu dưới dạng -> Encoding) và mã hóa '' Thẻ. Tôi khuyên bạn nên bắt đầu với một tệp XML đơn giản đơn giản được tạo bằng notepad hoặc vi trước. (không sao chép dán, chỉ cần gõ). Khi đã xong, hãy thử tăng xml. –