ฉันจะเข้าถึง Configuration ในคลาสใดก็ได้ใน ASP.NET Core ได้อย่างไร


128

ฉันได้อ่านเอกสารการกำหนดค่าบน ASP.NET core แล้ว เอกสารระบุว่าคุณสามารถเข้าถึงการกำหนดค่าได้จากทุกที่ในแอปพลิเคชัน

ด้านล่างนี้คือ Startup.cs ที่สร้างโดยเทมเพลต

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        if (env.IsEnvironment("Development"))
        {
            // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
            builder.AddApplicationInsightsSettings(developerMode: true);
        }

        builder.AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

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

        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseApplicationInsightsRequestTelemetry();

        app.UseApplicationInsightsExceptionTelemetry();

        app.UseMvc();
    }
}

ดังนั้นในStartup.csการกำหนดค่าการตั้งค่าทั้งหมด Startup.cs จึงมีคุณสมบัติที่ชื่อConfiguration

สิ่งที่ฉันไม่เข้าใจว่าคุณเข้าถึงการกำหนดค่านี้ในคอนโทรลเลอร์หรือที่ใดก็ได้ในแอปพลิเคชันได้อย่างไร MS ขอแนะนำให้ใช้รูปแบบตัวเลือกแต่ฉันมีคู่คีย์ - ค่าเพียง 4-5 คู่ดังนั้นฉันจึงไม่ต้องการใช้รูปแบบตัวเลือก ฉันแค่ต้องการเข้าถึง Configuration ในแอปพลิเคชัน ฉันจะฉีดมันในชั้นเรียนใดได้อย่างไร?


1
หากเป็นคู่ค่าคีย์ 4-5 คู่คุณก็ฉีดการตั้งค่าแต่ละรายการได้ ฉันขอแนะนำแนวทางนั้นหรือรูปแบบตัวเลือกเพื่อวัตถุประสงค์ในการทดสอบ ทั้งสามวิธี (รวมถึงวิธีที่คุณเคยถามในตอนแรก) แสดงเป็นคำตอบในคำถามที่อาจซ้ำกันได้ต่อไปนี้: stackoverflow.com/questions/30263681/…
stephen.vakil

หากต้องการเข้าถึงการกำหนดค่าเป็นพจนานุกรมจากทุกที่ให้ตรวจสอบคำตอบนี้
Amro

ตรวจสอบที่นี่เพื่อดูตัวอย่างโค้ดทั้งหมด
Arghya C

หากคุณมาที่นี่เพราะคุณกำลังยุ่งอยู่กับการแปลงการกำหนดค่า Framework เป็นการกำหนดค่า CORE คำตอบนี้เหมาะสำหรับคุณstackoverflow.com/a/56498687/1704458
TS

คำตอบ:


149

ปรับปรุง

การใช้ ASP.NET Core 2.0 จะเพิ่มอินสแตนซ์ของแอปพลิเคชันของคุณโดยอัตโนมัติIConfigurationในคอนเทนเนอร์การฉีดแบบพึ่งพา นอกจากนี้ยังทำงานร่วมกับConfigureAppConfigurationไฟล์WebHostBuilder.

ตัวอย่างเช่น:

public static void Main(string[] args)
{
    var host = WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        {
            builder.AddIniFile("foo.ini");
        })
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

มันง่ายพอ ๆ กับการเพิ่มIConfigurationอินสแตนซ์ไปยังคอลเลกชันบริการเป็นวัตถุเดี่ยวในConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
   services.AddSingleton<IConfiguration>(Configuration);

   // ...
}

Configurationอินสแตนซ์ในStartupชั้นเรียนของคุณอยู่ที่ไหน

สิ่งนี้ช่วยให้คุณฉีดIConfigurationในคอนโทรลเลอร์หรือบริการใด ๆ :

public class HomeController
{
   public HomeController(IConfiguration configuration)
   {
      // Use IConfiguration instance
   }
}

4
Mollerna .... แล้วถ้าคุณต้องการฉีดคอนฟิกูเรชันในโปรเจ็กต์ไลบรารีคลาสแยกต่างหากในโซลูชันล่ะ? พยายามเหมือน IConfiguration _configuration ส่วนตัวแบบคงที่ {get; ตั้ง; } DatabaseHelpers สาธารณะ (การกำหนดค่า IConfiguration) {_configuration = configuration; } แต่ _configuration เป็นโมฆะเสมอ ... มันไม่เคยโดนในตัวสร้าง
dinotom

2
ที่พูดผ่านไปIConfigurationแบบนั้นรั่วมาก ไกลกว่าที่จะใช้รูปแบบตัวเลือก
Marc L.

7
จะเข้าถึงค่าจาก "appsettings.json" โดยตรงในคลาสที่กำหนดเองได้อย่างไร? โดยไม่ส่งผ่านข้อมูลจากคอนโทรลเลอร์? เป็นไปได้ไหม?
ธ เดช

2
@HenkMollema คุณช่วยเพิ่มตัวอย่างที่นี่ได้ไหม ฉันจะฉีดมันไปยังชั้นเรียนใด (จากที่ไหน?)
ธ เดช

5
@HenkMollema คำถามคือวิธีการฉีดเข้าไปในคลาสใด ๆ ... ไม่ใช่วิธีการฉีดเข้าไปใน "คลาสใดก็ได้ที่แก้ไขผ่านการฉีดแบบพึ่งพา" ฉันคิดว่านั่นคือจุดที่การสื่อสารผิดพลาด ... คลาสของเขาไม่น่าจะถูกเรียกจากห่วงโซ่ที่เริ่มต้นด้วยคอนโทรลเลอร์หรือวัตถุอื่น ๆ ที่แก้ไขโดยอัตโนมัติโดยกระบวนการ DI อัตโนมัติ
BVernon

35

วิธีที่ถูกต้อง:

ใน. NET Core คุณสามารถฉีดIConfigurationเป็นพารามิเตอร์ลงในตัวสร้างคลาสของคุณและจะพร้อมใช้งาน

public class MyClass 
{
    private IConfiguration configuration;
    public MyClass(IConfiguration configuration)
    {
        ConnectionString = new configuration.GetValue<string>("ConnectionString");
    }

ตอนนี้เมื่อคุณต้องการสร้างอินสแตนซ์ของชั้นเรียนของคุณเนื่องจากชั้นเรียนของคุณได้รับการฉีดเข้าไปIConfigurationคุณจะไม่สามารถทำได้new MyClass()เพราะมันต้องการIConfigurationพารามิเตอร์ที่ฉีดเข้าไปในตัวสร้างดังนั้นคุณจะต้องฉีดคลาสของคุณเป็น ดีกับโซ่ฉีดซึ่งหมายถึงสองขั้นตอนง่ายๆ:

1) เพิ่มคลาสของคุณ - ตำแหน่งที่คุณต้องการใช้IConfigurationไปIServiceCollectionที่ConfigureServices()วิธีการในStartup.cs

services.AddTransient<MyClass>();

2) กำหนดอินสแตนซ์ - สมมติว่าในControllerและฉีดโดยใช้ตัวสร้าง:

public class MyController : ControllerBase
{
    private MyClass _myClass;
    public MyController(MyClass myClass)
    {
        _myClass = myClass;
    }

ตอนนี้คุณควรจะสามารถเพลิดเพลิน_myClass.configurationได้อย่างอิสระ ...

อีกทางเลือกหนึ่ง:

หากคุณยังคงมองหาวิธีที่จะทำให้พร้อมใช้งานโดยไม่ต้องฉีดคลาสลงในคอนโทรลเลอร์คุณสามารถจัดเก็บไว้ใน a static classซึ่งคุณจะกำหนดค่าในStartup.csสิ่งที่ต้องการ:

public static class MyAppData
{
    public static IConfiguration Configuration;
}

และตัวStartupสร้างของคุณควรมีลักษณะดังนี้:

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
    MyAppData.Configuration = configuration;
}

จากนั้นใช้MyAppData.Configurationที่ใดก็ได้ในโปรแกรมของคุณ

อย่าเผชิญหน้ากับฉันว่าทำไมตัวเลือกแรกจึงเป็นวิธีที่ถูกต้องฉันเห็นนักพัฒนาที่มีประสบการณ์มักจะหลีกเลี่ยงข้อมูลขยะตลอดทางและเป็นที่เข้าใจกันดีว่าไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในการมีข้อมูลจำนวนมากอยู่ในหน่วยความจำตลอดเวลา ไม่ดีต่อประสิทธิภาพและหรือสำหรับการพัฒนาและบางทีมันก็ปลอดภัยกว่าที่จะมีเฉพาะสิ่งที่คุณต้องการ


5
การฉีดไฟล์คอนฟิกูเรชันทั้งหมดนี้ดูเหมือนจะไม่มีจุดหมาย / ยุ่งเลย TY สำหรับแนวคิดคลาสคอนฟิกูเรชันแบบคงที่
Andrew

1
แน่นอนว่าคำถามเกี่ยวกับการเข้าถึงการกำหนดค่าในคลาสใด ๆ ไม่ใช่แค่คอนโทรลเลอร์เท่านั้น และในขณะที่มีการพัฒนาบริการแบบลีน (ไมโครเซอร์วิส) แบบใหม่นี้สามารถนึกถึงได้เมื่อพูดถึงการโยกย้ายนี่เป็นความเจ็บปวดอย่างมาก นี่คือเหตุผลที่ Microsoft ได้รับSystem.ConfigurationCORE ในการติดตาม ตอนนี้คุณสามารถเข้าถึง app.configs เก่าที่ดีของคุณได้เหมือนในสมัยก่อน และฉันไม่ได้พูดถึงตัวควบคุมที่นี่ เรากำลังพูดถึงส่วนประกอบที่มีการกำหนดค่าของตัวเอง
TS

อนุญาตให้เข้าถึงในคลาสใดก็ได้และไม่ใช่แค่ในคอนโทรลเลอร์เท่านั้น แต่ต้องนำเข้าสู่คอนโทรลเลอร์เพื่อให้ได้รับการพึ่งพาการฉีด
Mayer Spitzer

1
วิธีการใดก็ได้ผลและข้อโต้แย้งของแต่ละวิธีนั้นเป็นเรื่องวิชาการในความคิดของฉัน ฉันใช้ทั้งสองอย่างสำหรับแอปพลิเคชันที่แตกต่างกัน ... ตอนนี้ต้องขอบคุณตัวเลือกที่สองที่ง่ายมากของคุณ การสร้างคลาสแบบคงที่ค่อนข้างยากโดยใช้ DI
iGanja

วิธีที่สองยังช่วยแก้ปัญหาทั่วไปใน. Net Core 2.0 - อ็อบเจ็กต์ที่สร้างอินสแตนซ์เป็นพารามิเตอร์ POST (เช่น deserialized จาก JSON โดยอัตโนมัติ) ซึ่งคุณไม่มีโอกาสที่จะฉีดเข้าไปในตัวสร้าง (อย่างน้อยก็ไม่ต้องมาก ของรหัสพิเศษ) สิ่งนี้ใช้ได้ดีกับสถานการณ์นั้น
Joe Moon

30

ฉันรู้ว่ามันเก่า แต่เนื่องจากรูปแบบ IOptions นั้นค่อนข้างง่ายที่จะนำไปใช้:

  1. คลาสที่มีคุณสมบัติรับ / ตั้งสาธารณะที่ตรงกับการตั้งค่าในการกำหนดค่า

    public class ApplicationSettings
    {
        public string UrlBasePath { get; set; }
    }
  2. ลงทะเบียนการตั้งค่าของคุณ

    public void ConfigureServices(IServiceCollection services)
    {
     ...
     services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
    ...
    }
  3. ฉีดผ่าน IOptions

    public class HomeController
    {
       public HomeController(IOptions<ApplicationSettings> appSettings)
       { ...
        appSettings.Value.UrlBasePath
        ...
        // or better practice create a readonly private reference
        }
     }

ฉันไม่แน่ใจว่าทำไมคุณถึงไม่ทำแบบนี้


1
สำหรับการอ้างอิง: docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/…
gatsby

2
จะเข้าถึงค่าจาก "appsettings.json" โดยตรงในคลาสที่กำหนดเองได้อย่างไร?
ธ เดช

2
@JedatKinports คุณจะต้องเพิ่มการอ้างอิง Nuget Microsoft.Extensions.Configuration, Microsoft.Extensions.Configuration.BinderและMicrosoft.Extensions.Configuration.Jsonแล้วคุณโหลดappsettings.jsonไฟล์เช่น var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();..and คุณยังต้องให้แน่ใจว่าappsettings.jsonสำเนาไปยังไดเรกทอรีการส่งออกมีการตั้งค่าcopy always
LP13

9

นอกจากนี้ยังมีตัวเลือกในการสร้างconfigurationแบบคงที่ใน startup.cs เพื่อให้สิ่งที่คุณสามารถเข้าถึงได้ทุกที่อย่างง่ายดายตัวแปรคงนั้นสะดวกสบาย!

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

internal static IConfiguration Configuration { get; private set; }

ทำให้การกำหนดค่าสามารถเข้าถึงได้ทุกที่โดยใช้Startup.Configuration.GetSection...What can go wrong?


7

ฉันกำลังทำสิ่งนี้ในขณะนี้:

// Requires NuGet package Microsoft.Extensions.Configuration.Json

using Microsoft.Extensions.Configuration;
using System.IO;

namespace ImagesToMssql.AppsettingsJson
{
    public static class AppSettingsJson
    {           
        public static IConfigurationRoot GetAppSettings()
        {
            string applicationExeDirectory = ApplicationExeDirectory();

            var builder = new ConfigurationBuilder()
            .SetBasePath(applicationExeDirectory)
            .AddJsonFile("appsettings.json");

            return builder.Build();
        }

        private static string ApplicationExeDirectory()
        {
            var location = System.Reflection.Assembly.GetExecutingAssembly().Location;
            var appRoot = Path.GetDirectoryName(location);

            return appRoot;
        }
    }
}

จากนั้นฉันใช้สิ่งนี้ในที่ที่ฉันต้องการรับข้อมูลจากไฟล์ appsettings.json:

var appSettingsJson = AppSettingsJson.GetAppSettings();
// appSettingsJson["keyName"]

ในที่สุดสิ่งที่ทำงานในวิธีการคงที่โดยไม่ขึ้นอยู่กับความบ้าคลั่งของหัวฉีด ในที่สุดความเป็นอิสระที่ขัดแย้งกัน! ; -) ... แต่การพึ่งพา NuGet packacge มากมายเหลือเกิน!
Louis Somers

3

ฉันตรวจสอบตัวอย่างรูปแบบตัวเลือกและเห็นสิ่งนี้:

public class Startup
{
    public Startup(IConfiguration config)
    {
        // Configuration from appsettings.json has already been loaded by
        // CreateDefaultBuilder on WebHost in Program.cs. Use DI to load
        // the configuration into the Configuration property.
        Configuration = config;
    }
...
}

เมื่อเพิ่ม Iconfiguration ในคอนสตรัคเตอร์ของคลาสของฉันฉันสามารถเข้าถึงตัวเลือกการกำหนดค่าผ่าน DI

ตัวอย่าง:

public class MyClass{

    private Iconfiguration _config;

    public MyClass(Iconfiguration config){
        _config = config;
    }

    ... // access _config["myAppSetting"] anywhere in this class
}

มันใช้งานได้โดยไม่ต้องพูดถึง MyClass อย่างชัดเจนใน Startup.cs อะไรทำนองนี้? services.AddTransient <MyClass> ();
เจ้าพ่อ

ใช่จริงๆแล้วคุณควรพูดถึงคลาสที่คุณต้องการฉีดใน Startup.cs ไม่ใช่วิธีอื่น แต่ฉันคิดว่า IConfiguration โดยค่าเริ่มต้นมีให้ฉีดแล้ว
Pieter Heemeryck

ใช่มันใช้งานได้ ฉันลองทำสิ่งนี้หลังจากทำการแสดงความคิดเห็นและการใช้งาน config ถูกแทรกใน IConfiguration ขอบคุณมาก :)
The Godfather

1
@netfed ดังที่ Mayer Spitzer กล่าวในคำตอบของเขาแน่นอนว่าคุณจะต้องเพิ่ม MyClass เพื่อเริ่มต้นและฉีดไปที่ใดก็ได้ที่คุณต้องการดังนั้นคุณไม่จำเป็นต้องสร้าง MyClass ด้วยตัวคุณเองใหม่คุณจะฉีดมันในที่ที่คุณต้องการ
Pieter Heemeryck

2

ฉันรู้ว่าอาจมีหลายวิธีในการทำเช่นนี้ฉันใช้ Core 3.1 และกำลังมองหาตัวเลือกที่ดีที่สุด / สะอาดกว่าและฉันก็ทำสิ่งนี้:

  1. คลาสเริ่มต้นของฉันเป็นค่าเริ่มต้น
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}
  1. appsettings.json ของผมเป็นแบบนี้
{
  "CompanySettings": {
    "name": "Fake Co"
  }
}
  1. คลาสของฉันคือตัวควบคุม API ดังนั้นก่อนอื่นฉันเพิ่มการอ้างอิงโดยใช้แล้วจึงแทรกอินเทอร์เฟซ IConfiguration
using Microsoft.Extensions.Configuration;

public class EmployeeController 
{
    private IConfiguration _configuration;
    public EmployeeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
}
  1. ในที่สุดฉันก็ใช้เมธอด GetValue
public async Task<IActionResult> Post([FromBody] EmployeeModel form)
{
    var companyName = configuration.GetValue<string>("CompanySettings:name");
    // companyName = "Fake Co"
}

0

ใน 8-2017 Microsoft ออกมาพร้อมกับSystem.Configuration. NET CORE v4.4 ปัจจุบัน v4.5แสดงตัวอย่างและ v4.6 ในปัจจุบัน

สำหรับพวกเราที่ทำงานเกี่ยวกับการแปลงจาก. Net Framework เป็น CORE นี่เป็นสิ่งสำคัญ อนุญาตให้เก็บและใช้app.configไฟล์ปัจจุบันซึ่งสามารถเข้าถึงได้จากแอสเซมบลีใดก็ได้ อาจเป็นอีกทางเลือกหนึ่งappsettings.jsonเนื่องจาก Microsoft ตระหนักถึงความจำเป็น ใช้งานได้เหมือนเดิมใน FW มีความแตกต่างอย่างหนึ่ง:

ในการใช้งานเว็บ [เช่น ASP.NET CORE เว็บ API] คุณจำเป็นต้องใช้app.configและไม่ web.config ของคุณหรือappSettings configurationSectionคุณอาจต้องใช้web.configแต่ถ้าคุณปรับใช้ไซต์ของคุณผ่าน IIS เท่านั้น คุณวางการตั้งค่าเฉพาะ IIS ลงในweb.config

ฉันได้ทดสอบกับnetstandard20 DLL และAsp.net Core Web Apiแล้วและใช้งานได้ทั้งหมด


0

การใช้รูปแบบตัวเลือกใน ASP.NET Coreเป็นวิธีที่จะไป ฉันแค่ต้องการเพิ่มหากคุณต้องการเข้าถึงตัวเลือกภายใน startup.cs ของคุณฉันขอแนะนำให้ทำด้วยวิธีนี้:

CosmosDbOptions.cs:

public class CosmosDbOptions
{
    public string ConnectionString { get; set; }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // This is how you can access the Connection String:
    var connectionString = Configuration.GetSection(nameof(CosmosDbOptions))[nameof(CosmosDbOptions.ConnectionString)];
}

ดังนั้นถ้าฉันชอบส่วนย่อยทั้งหมดที่มีค่า config จำนวนโหลที่ฉันต้องเข้าถึงใน ConfigureServices ฉันต้องทำเพื่อทั้งหมดหรือไม่ ไม่มีวิธีอื่นใดในการดำเนินการผ่านรูปแบบ IOptions? ฉันต้องการฉีดเข้าไปในวิธีการขยายแบบคงที่ซึ่งฉันกำลังกำหนดค่าบัสขนส่งมวลชนของฉัน ข้อเสนอแนะจาก Microsoft เกี่ยวกับการไม่ใช้รูปแบบ IOptions ใน ConfigureServices docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/…
kuldeep

ฉันไม่ได้ใช้ IOPtions ใน ConfigureService ที่นี่ ...
Martin Brandl

-3

ฉันต้องอ่านพารามิเตอร์ของตัวเองเมื่อเริ่มต้น
สิ่งนี้จะต้องมีก่อนที่ WebHost จะเริ่มทำงาน (เนื่องจากฉันต้องการ url / IP และพอร์ต "เพื่อฟัง" จากไฟล์พารามิเตอร์และนำไปใช้กับ WebHost) นอกจากนี้ฉันต้องการการตั้งค่าสาธารณะในแอปพลิเคชันทั้งหมด

หลังจากค้นหามาระยะหนึ่ง (ไม่พบตัวอย่างที่สมบูรณ์มีเพียงตัวอย่าง) และหลังจากลองผิดลองถูกหลายครั้งฉันได้ตัดสินใจที่จะใช้ "วิธีเก่า" ด้วยไฟล์. ini ของตัวเอง
ดังนั้น .. หากคุณต้องการใช้ เป็นเจ้าของไฟล์. ini และ / หรือตั้งค่า "เพื่อฟัง url / IP" ของคุณเองและ / หรือต้องการการตั้งค่าสาธารณะสิ่งนี้เหมาะสำหรับคุณ ...

ตัวอย่างที่สมบูรณ์ใช้ได้สำหรับ core 2.1 (mvc):

สร้างไฟล์. ini - ตัวอย่าง:

[เริ่มต้น]
URL = http://172.16.1.201:22222
[พารามิเตอร์]
* Dummy1 = gew7623
Dummy1 = true
Dummy2 = 1

โดยที่ Dummyx จะรวมไว้เป็นตัวอย่างสำหรับประเภทวันที่อื่นที่ไม่ใช่สตริงเท่านั้น (และเพื่อทดสอบกรณี“ พารามิเตอร์ผิด” (ดูรหัสด้านล่าง)

เพิ่มไฟล์โค้ดในรูทของโปรเจ็กต์เพื่อเก็บตัวแปรส่วนกลาง:

namespace MatrixGuide
{
    public static class GV
    {
        // In this class all gobals are defined

        static string _cURL;
        public static string cURL // URL (IP + Port) on that the application has to listen
        {
            get { return _cURL; }
            set { _cURL = value; }
        }

        static bool _bdummy1;
        public static bool bdummy1 // 
        {
            get { return _bdummy1; }
            set { _bdummy1 = value; }
        }

        static int _idummy1;
        public static int idummy1 // 
        {
            get { return _idummy1; }
            set { _idummy1 = value; }
        }

        static bool _bFehler_Ini;
        public static bool bFehler_Ini // 
        {
            get { return _bFehler_Ini; }
            set { _bFehler_Ini = value; }
        }

        // add further  GV variables here..
    }
    // Add further classes here... 
}

เปลี่ยนรหัสใน program.cs (ก่อน CreateWebHostBuilder ()):

namespace MatrixGuide
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Read .ini file and overtake the contend in globale
            // Do it in an try-catch to be able to react to errors
            GV.bFehler_Ini = false;
            try
            {
                var iniconfig = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddIniFile("matrixGuide.ini", optional: false, reloadOnChange: true)
                .Build();
                string cURL = iniconfig.GetValue<string>("Startup:URL");
                bool bdummy1 = iniconfig.GetValue<bool>("Parameter:Dummy1");
                int idummy2 = iniconfig.GetValue<int>("Parameter:Dummy2");
                //
                GV.cURL = cURL;
                GV.bdummy1 = bdummy1;
                GV.idummy1 = idummy2;
            }
            catch (Exception e)
            {
                GV.bFehler_Ini = true;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("!! Fehler beim Lesen von MatrixGuide.ini !!");
                Console.WriteLine("Message:" + e.Message);
                if (!(e.InnerException != null))
                {
                    Console.WriteLine("InnerException: " + e.InnerException.ToString());
                }

                Console.ForegroundColor = ConsoleColor.White;
            }
            // End .ini file processing
            //
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>() //;
            .UseUrls(GV.cURL, "http://localhost:5000"); // set the to use URL from .ini -> no impact to IISExpress

    }
}

ทางนี้:

  • การกำหนดค่าแอปพลิเคชันของฉันแยกออกจาก appsettings.json และฉันไม่มีผลข้างเคียงที่ต้องกลัวหาก MS ทำการเปลี่ยนแปลงในเวอร์ชันอนาคต ;-)
  • ฉันมีการตั้งค่าของฉันในตัวแปรส่วนกลาง
  • ฉันสามารถตั้งค่า "เพื่อฟัง url" สำหรับแต่ละอุปกรณ์แอปพลิเคชันทำงานบน (เครื่อง dev ของฉันเซิร์ฟเวอร์อินทราเน็ตและเซิร์ฟเวอร์อินเทอร์เน็ต)
  • ฉันสามารถปิดการใช้งานการตั้งค่าได้ด้วยวิธีเดิม (เพียงแค่ตั้งค่า * ไว้ก่อน)
  • ฉันสามารถตอบสนองได้หากมีบางอย่างผิดปกติในไฟล์. ini (เช่นพิมพ์ไม่ตรงกัน)
    ถ้า - เช่น - ตั้งค่าประเภทผิด (เช่น * Dummy1 = gew7623 เปิดใช้งานแทน Dummy1 = true) โฮสต์จะแสดงสีแดง ข้อมูลบนคอนโซล (รวมถึงข้อยกเว้น) และฉันสามารถตอบสนองในแอปพลิเคชันได้เช่นกัน (GV.bFehler_Ini ตั้งค่าเป็น true หากมีข้อผิดพลาดกับ. ini)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.