ไม่สามารถตั้งค่าการกำหนดค่าจากไฟล์การตั้งค่าแอป JSON ในโครงการ .NET Core

เนื่องจากไม่มีคลาส ConfigurationManager ใน .NET Core ตอนนี้ฉันต้องตั้งค่า config ใน appsettings.json แทน web.config

ตามโพสต์บล็อก นี้ ฉันต้องตั้งค่า กำหนดค่าที่นั่น ดังนั้นฉันจึงทำสิ่งนี้:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },

  "Conexion": {
    "name" : "empresas",
    "connectionString": "Data Source=empresas;Initial Catalog=CATALMA; Integrated Security=True;",
    "providerName": "System.Data.SqlClient"
  }
}

ฉันเพิ่งเขียนว่า "Conexion"

ตอนนี้ฉันสร้างคลาสต่อไปนี้ในโฟลเดอร์ ViewModels:

public class ConexionConfig 
    {
       public string name { get; set; }
        public string connectionString { get; set; }
        public string providerName { get; set; }
    }

ตอนนี้ใน Startup.cs ในวิธี ConfigureServices ฉันต้องเพิ่มโดย:

public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.Configure<ConexionConfig>(Configuration.GetSection("Conexion"));
            services.AddMvc();
        }

แต่น่าเสียดายที่ฉันได้รับข้อผิดพลาดต่อไปนี้:

Argument 2: cannot convert from 
     'Microsoft.Extensions.Configuration.IConfigurationSection' to
     'System.Action<ConexionConfig>'

ฉันพลาดอะไรไป?


person Mr_LinDowsMac    schedule 21.07.2016    source แหล่งที่มา
comment
สวัสดี คุณเคยพบวิธีแก้ไขปัญหานี้หรือไม่? ฉันมีปัญหาเดียวกันทุกประการ   -  person AndyM    schedule 07.12.2016
comment
ใช่ฉันทำ แต่ฉันเปลี่ยนเนื้อหา appsettings.json ให้ตรงกับตัวอย่างที่ฉันเห็นที่อื่น   -  person Mr_LinDowsMac    schedule 08.12.2016
comment
ดูคำตอบที่โพสต์   -  person Mr_LinDowsMac    schedule 08.12.2016


คำตอบ (3)


ประการแรก คุณต้องเพิ่มแพ็คเกจ nuget ต่อไปนี้ให้กับ ASP Core Project ของคุณ

Microsoft.Extensions.Options.ConfigurationExtensions

วิธีการขยายที่มีอยู่ในแพ็คเกจจะช่วยให้คุณสามารถกำหนดค่าการกำหนดค่าที่พิมพ์อย่างรุนแรงตามที่คุณต้องการ

services.Configure<ConexionConfig>(Configuration.GetSection("Conexion"));

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

Microsoft.Extensions.Configuration.Binder

ซึ่งหมายความว่าคุณจะต้องเปิดใช้งานตัวเลือกบนไปป์ไลน์อย่างชัดเจน และผูกการดำเนินการ นั่นคือ:

services.AddOptions();
services.Configure<ConexionConfig>(x => Configuration.GetSection("Conexion").Bind(x));
person Sarel Esterhuizen    schedule 29.12.2016
comment
คำตอบนี้มีประโยชน์ โปรดทราบว่าสำหรับ ASP.NET Core 2.0 ไม่จำเป็นต้องใช้ NuGet เพิ่มเติม - person Arghya C; 10.02.2018
comment
@ArghyaC - บางสิ่งบางอย่างต้องมีการเปลี่ยนแปลงในการพึ่งพาไลบรารีเพราะฉันพบว่า คุณต้องการแพ็คเกจ NuGet ASP.Net Core 2.1 - person Jeremy Thompson; 10.04.2019
comment
ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเพราะสิ่งนี้ใช้ได้ผลสำหรับฉัน ฉันใช้ .NET Core 2.2 ใช้คำตอบแรกไม่ใช่ทางเลือกอื่น - person Gene S; 12.08.2019
comment
ประสบปัญหานี้หลังจากอัปเกรด .NET Core จาก 2.2 เป็น 3.1 นี่เป็นการแก้ปัญหาสำหรับฉัน - person smyk; 04.02.2020
comment
ฉันติดตั้ง Install-Package Microsoft.Extensions.Options.ConfigurationExtensions -Version 3.1.2 และทำงานได้อย่างสมบูรณ์แบบ - person Ciprian Jijie; 06.03.2020

ลองติดตั้งแพ็คเกจ nuget Microsoft.Extensions.Configuration.Binder และใช้วิธี Bind:

 services.Configure<ConexionConfig>(x => Configuration.GetSection("Conexion").Bind(x));

คุณต้องติดตั้งแพ็คเกจตัวเลือก Microsoft.Extensions.Options และเพิ่มการสนับสนุนหากคุณต้องการฉีดคลาสตัวเลือกของคุณ:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    //..
}

ตอนนี้คุณสามารถฉีด IOptions<ConexionConfig> ในคอนโทรลเลอร์และมุมมองของคุณได้แล้ว

person peco    schedule 22.07.2016
comment
สิ่งนี้จะใช้ได้ผลกับคุณถูกต้อง แต่หากใครต้องการกำหนดค่าในลักษณะเดียวกับบทช่วยสอนหลาย ๆ อันที่แสดงให้เห็นถึงปัญหา คุณก็เพียงแค่เพิ่มแพ็คเกจที่ถูกต้องเท่านั้น ดูคำตอบของฉัน... - person Sarel Esterhuizen; 29.12.2016

ฉันยึดตามตัวอย่างที่อื่น เปลี่ยน appsettings.json เป็นดังนี้:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Data Source=myserver\\sql08;Initial Catalog=enterprises;User id=userAPP;Password=mypassword;"
    }
  }
}

คลาส ConexionConfig เปลี่ยนเป็นสิ่งนี้:

 public class ConexionConfig
        {

        public string ConnectionString { get; set; }

    }
}

จากนั้นใน Startup.cs

...
public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddMvc();
            services.Configure<ConexionConfig>(Configuration.GetSection("Data:DefaultConnection"));
        }
...

สิ่งสำคัญคือต้องรวม using Microsoft.Extensions.Configuration ไว้ในไฟล์นี้

person Mr_LinDowsMac    schedule 08.12.2016
comment
ฉันคิดว่าข้อแตกต่างระหว่างคำถามเดิมของคุณกับคำตอบนี้คือคุณได้เพิ่มแพ็คเกจที่ถูกต้องไปพร้อมกัน ดูคำตอบของฉัน... - person Sarel Esterhuizen; 29.12.2016