2015-03-06 12 views
5

Chciałbym uzyskać dostęp do Active Directory z mojej firmy w wielu kontrolerach z mojego projektu ASP.NET vNext, i wstawiłem nazwę domeny do mojego pliku config.json, więc mam dostęp to z klasy Configuration. Uważam, że ciężko jest zawsze utworzyć nowy obiekt konfiguracyjny za każdym razem, gdy chcę uzyskać dostęp do pliku config.json, czy jest jakiś sposób przez interfejs API IConfiguration, aby uzyskać dostęp do klasy konfiguracji zainicjowanej w klasie uruchamiania?Dostęp do obiektu konfiguracyjnego z klasy startowej

+1

Zmieniłem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

Odpowiedz

10

Przykładem, jak można to zrobić:

Załóżmy, że masz config.json jak poniżej:

{ 
    "SomeSetting1": "some value here", 
    "SomeSetting2": "some value here", 
    "SomeSetting3": "some value here", 
    "ActiveDirectory": { 
     "DomainName": "DOMAIN-NAME-HERE" 
    } 
} 

Utwórz typ POCO posiadające informacje Opcja:

public class ActiveDirectoryOptions 
{ 
    public string DomainName { get; set; } 
} 

W pliku Startup.cs podczas konfigurowania usług:

services.Configure<ActiveDirectoryOptions>(optionsSetup => 
{ 
    //get from config.json file 
    optionsSetup.DomainName = configuration.Get("ActiveDirectory:DomainName"); 
}); 

We wszystkich sterowników, które chcą dostać to ustawienie config, coś jak ... Tutaj opcji jest wstrzykiwany przez system DI:

public class HomeController : Controller 
{ 
    private readonly IOptions<ActiveDirectoryOptions> _activeDirectoryOptions; 

    public HomeController(IOptions<ActiveDirectoryOptions> activeDirectoryOptions) 
    { 
     _activeDirectoryOptions = activeDirectoryOptions; 
    } 

    public IActionResult Index() 
    { 
     string domainName = _activeDirectoryOptions.Options.DomainName; 

     ........ 
    } 
} 

W odpowiedzi na komentarz:
Nie jest kilka opcji, które mogę myśleć:

  1. z poziomu działania, można zrobić

    var options = HttpContext.RequestServices.GetRequiredService<IOptions<ActiveDirectoryOptions>>().Options;

  2. Można mieć parametr do działania, które jest ozdobione FromServicesAttribute. Ten atrybut spowoduje, że wartość parametru zostanie pobrana z DI. Przykład:

    public IActionResult Index([FromServices] IOptions<ActiveDirectoryOptions> options)

Wolę # 2 na # 1 jak w przypadku testów jednostkowych daje informacje na temat wszystkich elementów zależnych.

+0

Dependency Injection było jedną z moich opcji, ale zakładam, że wstrzykniesz wiele repozytoriów wewnątrz kontrolera i obiektu UserManager, ponieważ potrzebujesz pewnej obsługi użytkownika, twój konstruktor będzie bardzo zajęty. I przez cały czas, gdy chcesz używać kontrolera, obiekt IOptions będzie instancjonowany, ale co, jeśli chcesz po prostu użyć tego obiektu w jednej metodzie kontrolera? –

+1

@ChrisProlls: Zaktualizowałem powyższą odpowiedź z danymi dotyczącymi Twojego komentarza. –

+0

# 2 działa bardzo ładnie :) Dzięki! Próbowałem # 1, ale potrzebuje obiektu HttpContext do korzystania z metody RequestServices, nie jest to metoda statyczna. Wcześniej moglibyśmy użyć System.Web do pobrania bieżącego HttpContext, ale z ASP.NET vNastępnie obszar nazw System.Web już nie istnieje. Jak mogę znaleźć bieżący HttpContext? –

Powiązane problemy