2016-08-01 24 views
8

DI'de .NET Core kullanımıyla ilgili pek çok kod örneği görüyorum, ancak bunların hiçbiri yapıcı parametrelerini kullanmıyor. Örneğin.net çekirdek içinde yapıcı parametresi ile bağımlılık enjeksiyonu

:

  • Yetkilendirme Hizmet oluşturun
  • Ben erişim

varsa uygulama kontroller sırasında yapıcı

  • mevcut HTTP başlığı (X-Api-Anahtarı) enjekte Burada sadece IAuthorizationService'umda DI kullanmamalı, aynı zamanda yapıcıdaki belirteci de enjekte etmem gerekiyor. Ninject'te nasıl yapılacağını biliyorum, ancak .NET Core DI'de deneyimim yok.

    Örnek olarak elimde bu var.

    public void ConfigureServices(IServiceCollection services) 
    { 
        services.AddMvc(); 
        services.AddEntityFrameworkSqlite(); 
        services.AddDbContext<MainDbContext>(); 
        services.AddScoped<IAuthorizationService, AuthorizationService>(); // Inject current HttpContext header value as a constructor? 
    } 
    
  • +0

    (https://docs.asp.net/en/latest/fundamentals/dependency: Doğru yapılandırıldığında

    , biz kontrolörleri veya hizmetlerde ApiKeyAccessor örneğini enjekte -injection.html) –

    +0

    Jetonu enjekte etmeniz gerekiyor mu yoksa belirteç sağlayan bir sınıf için arabirim enjekte edebilir misiniz? –

    +0

    @ScottHannen Hm, sanırım gerçekten önemli değil. Ancak belirteç daha iyi olurdu çünkü test edilebilirlik daha kolay olurdu. – sed

    cevap

    6

    Genellikle bu değerleri, verilerin bir ara katman yazılımında ayarlandığı bir hizmet aracılığıyla aktarabilirim.

    enjekte edilebilir bir erişimci sınıfı:

    public class ApiKeyAccessor 
    { 
        public string ApiKey { get; set; } 
    } 
    

    Ve istek başında API anahtarı ayarlayan bir ara katman: Örneğin Şimdi

    public class ApiKeyMiddleware 
    { 
        private readonly RequestDelegate _next; 
    
        public ApiKeyMiddleware(RequestDelegate next) 
        { 
         _next = next; 
        } 
    
        public Task Invoke(HttpContext context, ApiKeyAccessor apiKeyAccessor) 
        { 
         StringValues key; 
         if (context.Request.Headers.TryGetValue("X-Api-Key", out key)) 
         { 
          apiKeyAccessor.ApiKey = key; 
          return _next(context); 
         } 
    
         // todo: throw exception, etc.. 
        } 
    } 
    

    hepimiz etmektir var ApiKeyAccessor'u DI kapsayıcısına kapsamındaki kapsamıyla ekleyin ve ApiKeyMiddleware istek yürütme boru hattına tercihen en kısa sürede ekleyin. [Bu belgelere gördük]

    public class AuthorizationService 
    { 
        private readonly string _apiKey; 
    
        public AuthorizationService(ApiKeyAccessor apiKeyAccessor) 
        { 
         _apiKey = apiKeyAccessor.ApiKey; 
        } 
    } 
    
    +1

    Bunu beğendim - bir sınıf enjekte etmek - değer bir bağlantı dizgisi gibi değişmeyen bir şey olmadıkça bir değer enjekte etmekten daha fazlası. Herhangi bir DI kapsayıcısıyla, bir sınıfı, çalışma zamanında bir değer elde etmek üzere yapılandırmaktan daha kolaydır. –

    İlgili konular