ServiceStack NetCoreAppSettings 配置文件读取和设置

Posted 千军万马o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ServiceStack NetCoreAppSettings 配置文件读取和设置相关的知识,希望对你有一定的参考价值。

假设Node和npm已经安装

npm install -g @servicestack/cli

执行命令dotnet-new selfhost SSHost

这样就创建了ServiceStack的控制台程序,用VS2017解决方案,添加如下代码

 

using Funq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using ServiceStack;
using SSHost.ServiceInterface;
using System;
using System.IO;
using System.Threading.Tasks;

namespace SSHost
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseUrls(Environment.GetEnvironmentVariable("ASPNETCORE_URLS") ?? "http://localhost:5000/")
                .Build();

            host.Run();
        }
    }

    public class Startup
    {

        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration configuration) => Configuration = configuration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //nuget里添加Microsoft.Extensions.Configuration.json,否则编译不认识AddJsonFile
            var builder = new ConfigurationBuilder()
                  .SetBasePath(env.ContentRootPath)
                  .AddJsonFile($"appsettings.json", optional: true)
                  .AddEnvironmentVariables();

            Configuration = builder.Build();

            app.UseServiceStack(new AppHost
            {
                AppSettings = new NetCoreAppSettings(Configuration)
            });

            app.Run(context =>
            {
                context.Response.Redirect("/metadata");
                return Task.FromResult(0);
            });
        }
    }

    public class AppHost : AppHostBase
    {
        public AppHost()
            : base("SSHost", typeof(MyServices).Assembly) { }

        public class PageConfig
        {
            public int LightListPageSize { get; set; }

            public int GatewayListPageSize { get; set; }
        }

        public override void Configure(Container container)
        {
            SetConfig(new HostConfig
            {
                DebugMode = AppSettings.Get(nameof(HostConfig.DebugMode), false)
            });

            #region 读取或者设置NetCoreAppSettings

            //读取单个值
            Console.WriteLine($"MaxRecords: {AppSettings.GetString("MaxRecords")}");

            //读取对象属性
            Console.WriteLine($"PageConfig: {AppSettings.GetString("PageConfig:LightListPageSize")}");

            //读取整个对象
            var pageConfig = AppSettings.Get<PageConfig>("PageConfig");

            Console.WriteLine($"ConnectionString: {AppSettings.GetString("ConnectionStrings:DefaultConnection")}");

            //设置每页记录最大数量为200
            AppSettings.Set<int>("MaxRecords", 200);
            Console.WriteLine($"MaxRecords: {AppSettings.GetString("MaxRecords")}");

            pageConfig.LightListPageSize = 50;
            pageConfig.GatewayListPageSize = 60;

            //设置属性,然后读取对象
            AppSettings.Set<int>("PageConfig:LightListPageSize", 50);
            var pageConfig2 = AppSettings.Get<PageConfig>("PageConfig");

            Console.WriteLine("设置配置完毕");

            #endregion

        }
    }
}

 项目SSHost里添加配置文件appsettings.Json,里面配置内容如下

{
  "MaxRecords": "300",
  "PageConfig": {
    "LightListPageSize": "10",
    "GatewayListPageSize": "20"
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\\\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

编译运行,出现如下错误信息

1>------ 已启动全部重新生成: 项目: SSHost.ServiceModel, 配置: Debug Any CPU ------
1>SSHost.ServiceModel -> D:\\SSHost\\SSHost.ServiceModel\\bin\\Debug\\netstandard2.0\\SSHost.ServiceModel.dll
2>------ 已启动全部重新生成: 项目: SSHost.ServiceInterface, 配置: Debug Any CPU ------
2>SSHost.ServiceInterface -> D:\\SSHost\\SSHost.ServiceInterface\\bin\\Debug\\netstandard2.0\\SSHost.ServiceInterface.dll
3>------ 已启动全部重新生成: 项目: SSHost, 配置: Debug Any CPU ------
4>------ 已启动全部重新生成: 项目: SSHost.Tests, 配置: Debug Any CPU ------
4>SSHost.Tests -> D:\\SSHost\\SSHost.Tests\\bin\\Debug\\netcoreapp2.1\\SSHost.Tests.dll
3>Program.cs(47,20,47,31): error CS1061: “IConfigurationBuilder”未包含“AddJsonFile”的定义,并且找不到可接受第一个“IConfigurationBuilder”类型参数的可访问扩展方法“AddJsonFile”(是否缺少 using 指令或程序集引用?)
3>已完成生成项目“SSHost.csproj”的操作 - 失败。
========== 全部重新生成: 成功 3 个,失败 1 个,跳过 0 个 ==========

nuget里添加Microsoft.Extensions.Configuration.json,否则编译不认识AddJsonFile

再次编译运行

 

总结一下,ServiceStack的AppSettings功能非常强大,并且非常好用,不仅支持过去的Web.config,也支持.Net Core的appsettings.json,还支持文本文件

想了解更多的情况,可以查看文档:https://github.com/ServiceStack/docs/blob/master/docs/_documentation/AppSettings.md

 

以上是关于ServiceStack NetCoreAppSettings 配置文件读取和设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ServiceStack 5.0 项目中使用来自 ServiceStack 4.0 的服务模型?

具有模式的 ServiceStack IRedisClient ScanAllKeys 未按预期返回结果 (ServiceStack 5.7.0)

ServiceStack:添加 Blazor 支持?

ServiceStack.OrmLite 调用存储过程

哪个 Canoe 版本与链接中为 REDIS 客户端实现提供的 soln 兼容 https://github.com/ServiceStack/ServiceStack.Redis

解决ServiceStack.Redis的6000次限制问题