2016-08-22 11 views
36

chcę czytać tylko ciąg połączenia z pliku konfiguracyjnego i ze względu na to dodać plik o nazwie „AppAettings.json” do mojego projektu i dodaj zawartość niego:Jak odczytać ciąg połączenia w .NET Core?

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

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

On ASP.NET Użyłem tego:

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

Teraz jak mogę odczytać "DefaultConnection" w C# i zapisać go na zmiennej łańcuchowej w .NET Core?

+0

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration –

Odpowiedz

26

Można to zrobić z GetConnectionString przesuwnych metody:

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

System.Console.WriteLine(conString); 

lub ustrukturyzowany klasy dla DI:

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

Uruchomienie:

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")); 

A potem w domu kontrolera:

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(); 
    } 

z tym w appsettings.json:

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

"Smtp": { 
    "Server": "0.0.0.1", 
    "User": "[email protected]", 
    "Pass": "123456789", 
    "Port": "25" 
    } 
+1

'configure' jest metoda rozszerzenia. Powinny być używane najczęściej w następujący sposób: 'services.Configure (Configuration.GetSection (" Smtp "));' Oczywiście, to jest to samo, ale myślę, że ludzie nieświadomi po prostu zaczną robić to "niewłaściwie" , używając nieskomentowanej linii, więc może najlepiej usunąć linię. ;) –

+0

@ James Wilkins: Bardzo ważne obawy. Jednak wolę ten opis od używania go jako metody rozszerzenia - w ten sposób wiem, co jest robione gdzie, i mogę kopiować i wklejać z jednego miejsca do drugiego, bez problemów z powodu brakujących przestrzeni nazw importu. Jedyny problem polega na tym, że MS używa przestrzeni nazw do taksonomii zamiast zapobiegania kolizjom nazw - z tego powodu przestrzenie nazw są zbyt długie. Ponadto, jeśli usuniesz litery i użyjesz metod rozszerzeń, ten sam rodzaj osób zacznie narzekać na brak kompilacji kodu. Nie wszyscy używają IDE, więc jest lepiej w ten sposób. –

+0

Uważam, że większość ludzi nie zadaje sobie trudu, aby umieścić "użytki" w swoich przykładach kodu, co jest uzasadnieniem dla twojego punktu, ale także dlaczego metody przedłużania zawodzą w innym punkcie. ;) –

1

Sposób, że znalazłem się rozwiązać ten był w użyciu AddJsonFile w konstruktorze podczas uruchamiania (co pozwala znaleźć konfigurację zapisaną w pliku appsettings.json), a następnie użyć go do ustawienia prywatnej zmiennej _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(); 
    } 

A potem mogę ustawić ciąg konfiguracji następująco:

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

To jest na rdzeniu dotnet 1.1

+4

Jak mogę uzyskać dostęp do _config w mojej kontroli? – sunny

+0

Dodając go do kontenera DI w ConfigureServices w pliku Startup.cs. –

26

Oddelegowany Odpowiedź jest w porządku, ale nie bezpośrednio odpowiedzieć na to samo pytanie miałem o odczyt w ciągu połączenia. Poprzez wiele poszukiwań znalazłem nieco prostszy sposób robienia tego.

Przy uruchamianiu.cs

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

W kontrolerze dodać pole do konfiguracji i parametr dla niej na konstruktora

private readonly IConfiguration configuration; 

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

Teraz później w kodzie widoku można uzyskać dostęp to lubią:

connectionString = configuration.GetConnectionString("DefaultConnection"); 
1

Zobacz link, aby uzyskać więcej informacji: https://docs.microsoft.com/en-us/ef/core/miscellaneous/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"))); 
}