Przejrzałem dokumentację konfiguracji dotyczącą ASP.NET core. Dokumentacja mówi, że możesz uzyskać dostęp do konfiguracji z dowolnego miejsca w aplikacji.
Poniżej znajduje się plik Startup.cs utworzony przez szablon
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();
}
}
Więc Startup.cs
konfigurujemy wszystkie ustawienia, Startup.cs ma również właściwość o nazwieConfiguration
Czego nie jestem w stanie zrozumieć, jak uzyskujesz dostęp do tej konfiguracji w kontrolerze lub w dowolnym miejscu w aplikacji? MS zaleca użycie wzorca opcji, ale mam tylko 4-5 par klucz-wartość, więc nie chciałbym używać wzorca opcji. Chciałem tylko mieć dostęp do konfiguracji w aplikacji. Jak wstrzyknąć to w dowolnej klasie?
Odpowiedzi:
Aktualizacja
Użycie ASP.NET Core 2.0 spowoduje automatyczne dodanie
IConfiguration
wystąpienia aplikacji w kontenerze iniekcji zależności. Działa to również w połączeniu zConfigureAppConfiguration
naWebHostBuilder
.Na przykład:
Jest to tak proste, jak dodanie
IConfiguration
instancji do kolekcji usług jako pojedynczego obiektu wConfigureServices
:Gdzie
Configuration
jest instancja w twojejStartup
klasie.Pozwala to na wprowadzenie
IConfiguration
dowolnego kontrolera lub usługi:źródło
IConfiguration
ten sposób jest bardzo nieszczelne. O wiele lepiej jest użyć wzorca Options .W .NET Core możesz wstrzyknąć
IConfiguration
parametr jako parametr do konstruktora klasy i będzie on dostępny.Teraz, gdy chcesz utworzyć instancję swojej klasy, ponieważ twoja klasa zostanie wstrzyknięta
IConfiguration
, nie będziesz w stanie tego zrobićnew MyClass()
, ponieważ wymaga onaIConfiguration
parametru wstrzykniętego do konstruktora, więc będziesz musiał wstrzyknąć swoją klasę jako dobrze do łańcucha wtrysku, co oznacza dwa proste kroki:1) Dodaj swoje klasy (klasy) - gdzie chcesz użyć
IConfiguration
, do metodyIServiceCollection
atConfigureServices()
wStartup.cs
2) Zdefiniuj instancję - powiedzmy w
Controller
, i wstrzyknij ją za pomocą konstruktora:Teraz powinieneś móc
_myClass.configuration
swobodnie cieszyć się ...Jeśli nadal szukasz sposobu na udostępnienie go bez konieczności wstrzykiwania klas do kontrolera, możesz zapisać go w pliku
static class
, który skonfigurujesz wStartup.cs
, coś takiego:Twój
Startup
konstruktor powinien wyglądać tak:Następnie użyj
MyAppData.Configuration
dowolnego miejsca w programie.Nie konfrontuj mnie, dlaczego pierwsza opcja jest właściwa, widzę tylko, że doświadczeni programiści zawsze unikają danych śmieciowych po drodze i dobrze rozumiemy, że nie jest najlepszą praktyką, aby mieć mnóstwo danych dostępnych w pamięci przez cały czas, nie jest to również dobre dla wydajności ani dla rozwoju, a być może bezpieczniej jest mieć tylko to, czego potrzebujesz.
źródło
System.Configuration
wróciła do CORE. Teraz możesz uzyskać dostęp do starych, dobrych app.configs, tak jak za dawnych dobrych czasów. I nie mówię tutaj o kontrolerach. Mówimy o komponentach, które mają własne konfiguracjeWiem, że to jest stare, ale biorąc pod uwagę wzorce IOptions, jest stosunkowo proste do zaimplementowania:
Klasa z publicznymi właściwościami get / set, które pasują do ustawień w konfiguracji
zarejestruj swoje ustawienia
wstrzyknąć przez IOptions
Nie jestem pewien, dlaczego po prostu tego nie zrobiłeś.
źródło
Microsoft.Extensions.Configuration
,Microsoft.Extensions.Configuration.Binder
aMicrosoft.Extensions.Configuration.Json
następnie załadowaćappsettings.json
plik taki jak ... avar config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
także upewnić się, żeappsettings.json
kopiowanie do katalogu wyjściowego jest ustawione nacopy always
Istnieje również opcja
configuration
statyczna w pliku startup.cs, dzięki czemu zmienne statyczne są wygodne, jeśli masz do nich łatwy dostęp, hę!Dzięki temu konfiguracja jest dostępna w dowolnym miejscu przy użyciu
Startup.Configuration.GetSection...
Co może pójść nie tak?źródło
W tej chwili robię to tak:
A potem używam tego, gdzie muszę pobrać dane z pliku appsettings.json:
źródło
Zajrzałem do próbki wzoru opcji i zobaczyłem to:
Dodając Iconfiguration w konstruktorze mojej klasy, mogłem uzyskać dostęp do opcji konfiguracyjnych przez DI.
Przykład:
źródło
Wiem, że może być na to kilka sposobów, używam Core 3.1 i szukałem optymalnej / czystszej opcji i skończyło się na tym:
źródło
W 8-2017 Microsoft wypuścił
System.Configuration
dla .NET CORE v4.4. Obecnie wersja zapoznawcza wersji 4.5 i 4.6 .Dla tych z nas, którzy pracują nad transformacją z .Net Framework do CORE, jest to niezbędne. Umożliwia przechowywanie i używanie aktualnych
app.config
plików, do których można uzyskać dostęp z dowolnego zestawu. Prawdopodobnie może to być nawet alternatywa dlaappsettings.json
, ponieważ Microsoft zdał sobie sprawę z takiej potrzeby. Działa tak samo jak wcześniej w FW. Jest jedna różnica:W aplikacjach internetowych [np. ASP.NET CORE WEB API] musisz używać,
app.config
a nie web.config dla swojegoappSettings
lubconfigurationSection
. Może być konieczne użycie,web.config
ale tylko w przypadku wdrażania witryny za pośrednictwem usług IIS. Umieszczasz ustawienia specyficzne dla usług IIS w programieweb.config
Przetestowałem to z netstandard20 DLL i Asp.net Core Web Api i wszystko działa.
źródło
Najlepszym sposobem jest użycie wzorca opcji w ASP.NET Core . Chcę tylko dodać, jeśli potrzebujesz dostępu do opcji w swoim startup.cs , polecam zrobić to w ten sposób:
CosmosDbOptions.cs:
Startup.cs:
źródło
Muszę odczytać własne parametry przy starcie.
To musi być tam przed uruchomieniem WebHost (ponieważ potrzebuję adresu URL / IP „do nasłuchiwania” i portu z pliku parametrów i zastosowania go do hosta WebHost). Ponadto potrzebuję ustawień publicznych w całej aplikacji.
Po dłuższym wyszukiwaniu (nie znaleziono pełnego przykładu, tylko fragmenty) i po różnych próbach i błędach, zdecydowałem się zrobić to w „stary sposób” z własnym plikiem .ini.
Więc ... jeśli chcesz użyć swojego mieć własny plik .ini i / lub ustaw "do nasłuchiwania url / IP" swoje własne i / lub potrzebujesz publicznych ustawień, to jest dla ciebie ...
Kompletny przykład, ważny dla rdzenia 2.1 (MVC):
Utwórz plik .ini - przykład:
przy czym Dummyx są uwzględniane tylko jako przykład dla innych typów dat niż string (a także do testowania przypadku „zły parametr” (patrz kod poniżej).
Dodano plik kodu w katalogu głównym projektu do przechowywania zmiennych globalnych:
Zmieniono kod w program.cs (przed CreateWebHostBuilder ()):
Tą drogą:
Niezgodność typów) Jeśli - np. - ustawiony jest niewłaściwy typ (np. * Dummy1 = gew7623 jest aktywowany zamiast Dummy1 = true) host wyświetla kolor czerwony informacje są na konsoli (w tym wyjątek) i mogę zareagować również w aplikacji (GV.bFehler_Ini jest ustawione na true, jeśli wystąpią błędy z .ini)
źródło