2016-08-01 277 views
9

我使用新的ConfigurationBuilder和Options模式对.NET核心库进行了第一次小小的冒险。.Net核心/控制台应用程序/配置/ XML

的优秀范例地块的:https://docs.asp.net/en/latest/fundamentals/configuration.html 和例子here

项目1.它说,这可与非MVC应用程序中使用的一个很好的副本,但对如何使用它没有MVC没有例子 - 特别是如果您正在使用自定义的强类型类。 我希望看到一个使用控制台应用程序显示DependencyInjection,Configuration和Logging设置的示例。

项目2.它表示您可以回写,但没有关于如何将任何更改保留回文件存储的示例或文档。 我想看看如何使用强类型的类持久化回到配置的例子。在Json还是XML中?

项目3.所有示例需要一只手被炸初始文件 - 想看到从一个强类型类创建初始JSON/xml文件的例子(派上用场的时候有许多参数应用程序)。

如果我可以在此上花足够的时间(而不是重新发布文档中已有的示例),我会做到的! 如果您知道某个帖子/文档可以帮助我,我将不胜感激。

+0

你说你有问题,但我没有看到任何问题,只抱怨缺失的例子。如果你要求这些例子,那么这不是什么意思。 – svick

+0

我可以找到任何我想要的示例或文档,我希望另一位开发人员能够指引我正确的方向,或者指向我一些文档。 – codeputer

+0

Microsoft欢迎社区在其文档站点以及Stack Overflow文档中撰写这些主题。您可以留意他们或在那里提出要求。像这样一个快速移动的平台让文档变得无聊,所以我并不感到惊讶,许多事情都缺失了。 –

回答

19

如何为依赖注入,日志记录和配置配置.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文件。你的配置应该有一个部分,其设置的名称与设置类的公共属性相匹配。

+0

Article链接中真正缺少的是Using语句(以及相关的NuGet包需要)来访问扩展方法。获得的教训 - 对.Net核心的扩展方法保持警惕! – codeputer

+0

仍在与XML文件读取相对,而不是JSON。瑞安克劳馥推送我包括.Extention.Configuration.XML,但我得到一个UTF-16异常(无法转换?)。 – codeputer

+0

哇我没有看到一段时间的UTF-16 ...要检查的是你的文本文件编码(在记事本上:另存为 - >编码)和你的'<?xml version =“1.0”encoding =“ISO-8859- 1“?>'标签。我建议首先使用记事本或vi创建一个简单的简单XML文件。 (不要复制粘贴,只需键入)。一旦工作,尝试增加xml。 –

相关问题