2016-07-15 12 views
12

Próbuję uzyskać dostęp do pliku appsetting.json z biblioteki klas. Do tej pory znalazłem rozwiązanie polegające na stworzeniu interfejsu klasy implementującej interfejs IConfiguration z Microsoft.Extensions.Configuration i dodaniu pliku json do klasy i odczytaniu go z tego samego.Dostęp z biblioteki klas do appsetting.json w Asp.net-core

var configuration = new Configuration(); 
configuration.AddJsonFile("appsetting.json"); 
var connectionString= configuration.Get("connectionString"); 

To wydaje się być złym rozwiązaniem, ponieważ musimy dodać plik json za każdym razem, gdy mamy dostęp do konfiguracji składu. Nie mamy żadnej alternatywy jak ConfigurationManager w ASP.NET.

+0

Możliwy duplikat [Używanie IConfiguration w bibliotece klasy C#] (https://stackoverflow.com/questions/27880433/using-iconfiguration-in-c-sharp-class-library) –

+0

Czy ten sam problem, który [Korzystanie z IConfiguration w bibliotece klasy # C# (https://stackoverflow.com/q/27880433/1647238), zobacz [moja odpowiedź] (https://stackoverflow.com/a/47645131/1647238) –

Odpowiedz

13

Zakładam, że chcesz uzyskać dostęp do pliku appsettings.json z aplikacji internetowej, ponieważ biblioteki klas domyślnie nie mają wartości appsettings.json.

Tworzę klasę modelu, która ma właściwości pasujące do ustawień w sekcji appsettings.json.

Sekcja w appsettings.json

"ApplicationSettings": { 
    "SmtpHost": "mydomain.smtp.com", 
    "EmailRecipients": "[email protected];[email protected]" 
} 

klasa Dopasowanie modelu

namespace MyApp.Models 
{ 
    public class AppSettingsModel 
    { 
     public string SmtpHost { get; set; } 
     public string EmailRecipients { get; set; } 
    } 
} 

następnie wypełnić tę klasę modelu i dodać go do kolekcji IOptions w kontenerze DI (odbywa się to w metodzie Startup klasy Configure()).

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings")); 

// Other configuration stuff 

services.AddOptions(); 

Następnie można uzyskać dostęp do tej klasy z dowolnej metody, która wywołuje framework, dodając go jako parametr w konstruktorze. Struktura obsługuje wyszukiwanie i dostarczanie klasy konstruktorowi.

public class MyController: Controller 
{ 
    private IOptions<AppSettingsModel> settings; 

    public MyController(IOptions<AppSettingsModel> settings) 
    { 
     this.settings = settings; 
    } 
} 

Następnie, gdy metoda w bibliotece klas wymaga ustawień, albo przekazuję ustawienia pojedynczo, albo przechodzę przez cały obiekt.

+0

Nie jestem pewien, czy coś się zmieniło, ponieważ zostało to zaakceptowane jako odpowiedź, ale nie zadziałało to, gdy dwa dni temu zacząłem nowy projekt. Zmiany, które wprowadziłem, aby działały, były: Zamiast ustawień IOptions , musiałem zmienić to ustawienie na AppSettingsModel; Następnie w konstruktorze kontrolera zmieniłem tę linię this.settings = settings; do this.settings = settings.Value; Potem zaczęło działać. – Syed

+0

Powyższa odpowiedź zapomniała następującego wiersza kodu w Startupie po wywołaniu services.Configure <>(): 'services.AddOptions();' –

+0

@StephenPorter Poczuj wygodnie, aby dodać swoją linię w swojej odpowiedzi. – gtzinos

20

Wiem, że odpowiedź została już zaakceptowana, ale to pytanie jest głównym hitem w Google, a pytanie OP dotyczy bibliotek klasowych, a nie aplikacji internetowej ASP.NET lub WebApi, której używa zaakceptowana odpowiedź.

IMO, biblioteki klas nie powinny używać ustawień aplikacji i nie powinny być agnostyczne dla takich ustawień. Jeśli potrzebujesz ustawień aplikacji w bibliotece klas, powinieneś podać te ustawienia od swojego klienta. Możesz zobaczyć przykład tego: On This SO Question

+3

Częściowo się zgadzam; w przypadku ** projektów testowych **, które są skonfigurowane jako biblioteki klas w rdzeniowym rozwiązaniu dotnet, dopuszczalne jest używanie lub umieszczanie ustawień aplikacji. W tym przypadku projekt testowy, np. biblioteka klasowa _jest_ konsumentem oczywiście. –

+0

@Moriarty Prawda, ale w niektórych przypadkach możesz mieć wiele środowisk, w których można uruchomić pakiet testowy. W takim przypadku ustawienia osadzone nie będą działały (np. Masz testy integracyjne, które muszą wiedzieć, jakie środowisko należy rozmawiać z interfejsem API). Nie sądzę, że zawsze tak jest i tak jest zawsze w każdym przypadku. –

+0

Oczywiście biblioteki klas powinny używać łańcucha połączenia wskazującego lokalną instancję db. To ustawienie jest nadpisywane przez system CI w celu użycia innej instancji. IMHO TEN odpowiedź nie ma jeszcze rozwiązania. Nie chodzi tu o rdzeń asp.net, ale o CORE w aplikacji czytając appsettings! – Pascal

Powiązane problemy