.NET कोर में कनेक्शन स्ट्रिंग कैसे पढ़ें?


108

मैं एक कॉन्फ़िगरेशन फ़ाइल से सिर्फ एक कनेक्शन स्ट्रिंग पढ़ना चाहता हूं और इसके लिए अपने प्रोजेक्ट में "appsettings.json" नाम के साथ एक फ़ाइल जोड़ें और इस पर यह सामग्री जोड़ें:

{
"ConnectionStrings": {
  "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-

 WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
    "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
   }
 }
}

ASP.NET पर मैंने इसका उपयोग किया है:

 var temp=ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

अब मैं C # में "DefaultConnection" कैसे पढ़ सकता हूं और इसे .NET कोर में एक स्ट्रिंग चर पर संग्रहीत कर सकता हूं?


जवाबों:


101

आप GetConnectionString एक्सटेंशन-विधि के साथ ऐसा कर सकते हैं:

string conString = Microsoft
   .Extensions
   .Configuration
   .ConfigurationExtensions
   .GetConnectionString(this.Configuration, "DefaultConnection");

System.Console.WriteLine(conString);

या DI के लिए एक संरचित वर्ग के साथ:

public class SmtpConfig
{
    public string Server { get; set; }
    public string User { get; set; }
    public string Pass { get; set; }
    public int Port { get; set; }
}

चालू होना:

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)
{
    // http://developer.telerik.com/featured/new-configuration-model-asp-net-core/
    // services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));
    Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<SmtpConfig>(services, Configuration.GetSection("Smtp"));

और फिर होम-कंट्रोलर में:

public class HomeController : Controller
{

    public SmtpConfig SmtpConfig { get; }
    public HomeController(Microsoft.Extensions.Options.IOptions<SmtpConfig> smtpConfig)
    {
        SmtpConfig = smtpConfig.Value;
    } //Action Controller


    public IActionResult Index()
    {
        System.Console.WriteLine(SmtpConfig);
        return View();
    }

इसके साथ appsettings.json में:

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
},

"Smtp": {
    "Server": "0.0.0.1",
    "User": "user@company.com",
    "Pass": "123456789",
    "Port": "25"
  }

9
Configureएक विस्तार विधि है। इसे सबसे अधिक इस तरह से इस्तेमाल किया जाना चाहिए: services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));यकीन है, यह एक ही बात है, लेकिन मुझे लगता है कि लोगों को पता नहीं है कि यह बस "गलत" तरीके से करना शुरू कर देगा, अनियंत्रित लाइन का उपयोग करना, इसलिए शायद लाइन को हटाने के लिए सबसे अच्छा है। ;)
जेम्स विल्किंस

@ जेम्स विल्किंस: बहुत वैध चिंताएं। हालाँकि, मैं वास्तव में इसे विस्तार विधि के रूप में उपयोग करने से अधिक इस धारणा को पसंद करता हूं - इस तरह से मुझे पता है कि क्या किया जा रहा है, और आयात नामस्थानों की अनुपलब्धता के कारण समस्याओं को प्राप्त किए बिना, 1 स्थान से दूसरे स्थान पर कॉपी-पेस्ट कर सकते हैं। एकमात्र समस्या यह है कि, एमएस नाम टक्कर की रोकथाम के बजाय वर्गीकरण के लिए नाम स्थान का उपयोग करता है - क्योंकि, नाम स्थान बहुत लंबे हैं। इसके अलावा, यदि आप नामस्थानों को हटाते हैं और एक्सटेंशन विधियों का उपयोग करते हैं, तो उसी तरह के लोग कोड के बारे में शिकायत करना शुरू नहीं करेंगे। हर कोई आईडीई का उपयोग नहीं करता है, इसलिए यह इस तरह से बेहतर है।
स्टीफन स्टीगर

3
@JedatKinports: नहीं, केवल इंजेक्शन। यहां तक ​​कि अगर आप एक स्थिर विधि लिखेंगे, तो भी आपको कॉन्फ़िगरेशन की आवश्यकता होगी। आप बस मैन्युअल रूप से एक JSON / YAML फ़ाइल पढ़ सकते हैं। लेकिन यह ओवरराइट्स को खत्म कर देगा, जैसे कि यूजर्स खेद या अन्य (जैसे रजिस्ट्री से कॉन्फ़िगरेशन)।
स्टीफन स्टीगर

1
मुझे एक त्रुटि मिल रही है: "MyClass में 'कॉन्फ़िगरेशन' के लिए एक परिभाषा शामिल है ..."
रॉबर्ट स्मिथ

3
कनेक्शन स्ट्रिंग भाग में "this.Configuration" क्या है? GetConnectionString (यह।
कॉन्फ़िगरेशन

111

पोस्ट किया गया उत्तर ठीक है, लेकिन सीधे उसी प्रश्न का उत्तर नहीं दिया है जो मैंने कनेक्शन स्ट्रिंग में पढ़ने के बारे में था। बहुत खोज के माध्यम से मुझे ऐसा करने का थोड़ा सरल तरीका मिला।

Startup.cs में

public void ConfigureServices(IServiceCollection services)
{
    ...
    // Add the whole configuration object here.
    services.AddSingleton<IConfiguration>(Configuration);
}

अपने नियंत्रक में कॉन्फ़िगरेशन के लिए एक क्षेत्र और एक निर्माता पर इसके लिए एक पैरामीटर जोड़ें

private readonly IConfiguration configuration;

public HomeController(IConfiguration config) 
{
    configuration = config;
}

अब बाद में आपके व्यू कोड में आप इसे एक्सेस कर सकते हैं जैसे:

connectionString = configuration.GetConnectionString("DefaultConnection");

2
ऐसा नहीं होगा। यदि आप इकाई ढांचे के बिना काम करते हैं, तो आप बेहतर रूप से सिंग्लटन के रूप में एक कनेक्शन कारखाने को पंजीकृत करते हैं, उदाहरण के लिए डैपर के साथ उपयोग करने के लिए। यदि आप की जरूरत है, तो आप अभी भी एक कनेक्शन संपत्ति का पर्दाफाश कर सकते हैं, लेकिन मुझे यकीन है कि यह 99% मामलों में आवश्यक नहीं होगा।
स्टीफन स्टीगर

2
लेकिन नियंत्रक के बजाय मॉडल में कॉन्फ़िगरेशन का उपयोग कैसे करें?
तन्मय

2
जितना अधिक मैं चीजों को पढ़ता हूं और कोशिश करता हूं, उतना ही मुझे एक कनेक्शन स्ट्रिंग मिलने का एहसास होता है। मैं बस कोशिश करता हूं कि मुझे कोई फर्क न पड़े।
MC9000

7
हाँ। बहुत सारे कंप्यूटर वैज्ञानिक केवल "हैलो वर्ल्ड" कहने के लिए विशाल उच्च फांसी फल बनाते हैं। अविश्वसनीय। यह सबसे अच्छा है में प्रवेश।
जस्टजॉन

2
@JustJohn: मैं आपकी शिकायत को समझता हूं, लेकिन उचित डिजाइन परीक्षण योग्य है, और इसका मतलब है कि आपको कंस्ट्रक्टर में निर्भरता से गुजरना होगा, अन्यथा आपका आवेदन / ढांचा इकाई-परीक्षण योग्य नहीं है। यह भी उचित डिज़ाइन है, क्योंकि आप एक घटक को दूसरे के साथ बदल सकते हैं, बिना पूरे कोड को बदलने के लिए। यदि आप 100 तर्कों को पास नहीं करना चाहते हैं, तो आप System.IServiceProvider को कक्षा में भी पास कर सकते हैं, फिर आप वहां निर्भरता प्राप्त कर सकते हैं। लेकिन सिक्के का दूसरा पहलू यह है कि यह जोड़ा जटिलता के साथ आता है।
स्टीफन स्टीगर

18

अधिक जानकारी के लिए लिंक देखें: https://docs.microsoft.com/en-us/ef/core/misc विविध/ connection-strings

JSON

    {
      "ConnectionStrings": {
        "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
      },
    }

C # Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

संपादित करें: Aspnetcore, 3.1 से शुरू: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1


ConnectionStringsइसके बजाय JSON फ़ाइल क्यों होनी चाहिए ConnectionString? क्योंकि जब मैंने उपयोग किया ConnectionString, तब हम अशक्त हो रहे हैं।
विजय

@Vijay निर्धारित पद्धति का उपयोग करके देखें;) कृपया संलग्न लिंक देखें।
मार्कोस्टेट करें

1
यह विधि Microsoft.Extensions.Configuration(3.1.5) के रूप में
पुरानी है

7

जिस तरह से मुझे यह हल करने के लिए मिला वह स्टार्टअप में एक बिल्डर में AddJsonFile का उपयोग करना था (जो इसे appsettings.json फ़ाइल में संग्रहीत कॉन्फ़िगरेशन को खोजने की अनुमति देता है) और फिर एक निजी _config चर सेट करने के लिए उपयोग करें

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)
            .AddEnvironmentVariables();
        _config = builder.Build();
    }

और फिर मैं विन्यास स्ट्रिंग सेट कर सकता है:

var connectionString = _config.GetConnectionString("DbContextSettings:ConnectionString"); 

यह डॉटनेट कोर 1.1 पर है


5
मैं अपने नियंत्रण में _config का उपयोग कैसे कर सकता हूं?
धूप

Startup.cs में ConfigureServices में DI कंटेनर में इसे जोड़कर।
स्टीफन स्टीगर

3

ASP.NET Core ( मेरे मामले में 3.1 ) हमें नियंत्रकों में कंस्ट्रक्टर इंजेक्शन प्रदान करता है , इसलिए आप बस निम्नलिखित निर्माता जोड़ सकते हैं:

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    private readonly IConfiguration m_config;

    public TestController(IConfiguration config)
    {
        m_config = config;
    }

    [HttpGet]
    public string Get()
    {
        //you can get connection string as follows
        string connectionString = m_config.GetConnectionString("Default")
    }
}

यहाँ क्या appsettings.json लग सकता है:

{
    "ConnectionStrings": {
        "Default": "YOUR_CONNECTION_STRING"
        }
}

0

एक और दृष्टिकोण है। मेरे उदाहरण में आप रिपॉजिटरी क्लास में कुछ व्यावसायिक तर्क देखते हैं जो मैं ASP .NET MVC कोर 3.1 में निर्भरता इंजेक्शन के साथ उपयोग करता हूं।

और यहाँ मैं connectiongStringउस व्यावसायिक तर्क के लिए जाना चाहता हूं क्योंकि शायद एक और रिपॉजिटरी के पास दूसरे डेटाबेस तक पहुंच होगी।

यह पैटर्न आपको एक ही व्यापार तर्क में अनुमति देता है रिपॉजिटरी की अलग-अलग डेटाबेस तक पहुंच है।

सी#

public interface IStatsRepository
{
            IEnumerable<FederalDistrict> FederalDistricts();
}

class StatsRepository : IStatsRepository
{
   private readonly DbContextOptionsBuilder<EFCoreTestContext>
                optionsBuilder = new DbContextOptionsBuilder<EFCoreTestContext>();
   private readonly IConfigurationRoot configurationRoot;

   public StatsRepository()
   {
       IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
       configurationRoot = configurationBuilder.Build();
   }

   public IEnumerable<FederalDistrict> FederalDistricts()
   {
        var conn = configurationRoot.GetConnectionString("EFCoreTestContext");
        optionsBuilder.UseSqlServer(conn);

        using (var ctx = new EFCoreTestContext(optionsBuilder.Options))
        { 
            return ctx.FederalDistricts.Include(x => x.FederalSubjects).ToList();
        }
    }
}

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "EFCoreTestContext": "Data Source=DESKTOP-GNJKL2V\\MSSQLSERVER2014;Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

-1

मेरे पास एक डेटा एक्सेस लाइब्रेरी है जो .net कोर और .net फ्रेमवर्क दोनों के साथ काम करती है।

ट्रिक .net कोर प्रोजेक्ट्स में कनेक्शन स्ट्रिंग्स को xml फ़ाइल में "app.config" (वेब ​​परियोजनाओं के लिए भी) रखने के लिए था, और इसे 'आउटपुट निर्देशिका में कॉपी' के रूप में चिह्नित करें।

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="conn1" connectionString="...." providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

ConfigurationManager.ConnectionStrings - कनेक्शन स्ट्रिंग पढ़ेंगे।

    var conn1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;

यदि आप .NET कोर का उपयोग कर रहे हैं, तो .NET फ्रेमवर्क पैटर्न में जूता के बजाय इसके कॉन्फ़िगरेशन पैटर्न को अपनाना सबसे अच्छा है।
Simmetric

-2

आप कॉन्फ़िगरेशन एक्सटेंशन विधि का उपयोग कर सकते हैं: getConnectionString ("DefaultConnection")

https://docs.asp.net/projects/api/en/latest/autoapi/Microsoft/Extensions/Configuration/ConfigurationExtensions/index.html#Microsoft.Extensions.Configuration.ConfigurationExtensions.GetConnectionString


9
यह लिंक मृत प्रतीत होता है
मार्क वैगनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.