2016-03-23 25 views
1

Dahili DI framework kullanarak asp.net çekirdek bir uygulama var. Sağlayıcıya istek başına (yani geçici) hizmet eklemek isterim, ancak isteğini yapım aşamasında kullanmak isterim.AddTransient servis istek üzerine bilgi kullanarak

services.AddTransient<IMyService>(provider => { ... }); 
bulabilirim yakın aşırı olduğunu

ama provider nesne geçerli isteği hakkında bir şey yok. Daha sağlam bir DI çerçevesine yükseltmeden yapmaya çalıştığım şeyi elde etmenin bir yolu var mı?

+1

btw. istek başına verilen hizmetler için 'AddScope 've' AddTransient 'kullanmazsınız. 'AddTransient' her çözünürlük için yeni bir örnek oluşturacaktır, yani aynı depoyu kullanarak iki hizmet enjekte ederseniz, her iki hizmet de istekleri için paylaşılan bir değil, kendi depo örneğini alacaktır. – Tseng

+0

Serviste tam olarak neye ihtiyacınız olduğunu belirtebilir misiniz? 'HttpContext'? Ya da farklı bir şey? 'HttpContext' kolayca enjekte edilebilir, diğer şeyler almak daha zor olabilir – Tseng

+0

Ben 'HttpContext' yeterli olmalı ve tamamen haklıyım,' AddTransient' yerine 'AddScoped' kullanmak istedim. Şu anda AFK'm, ama 'AddScoped' için aşırı yüküm var mı? – gzak

cevap

1

Açıklamalarda yer aldığı gibi, IHttpContextAccessor hizmetinize enjekte edebilir ve HttpContext gereksinim duyduğunuz tek şey ise, erişim sağlayabilirsiniz. Eğer HttpContext ait denetleyicisi veya dışarıdan yalnızca kullanılabilir bir şey gerekiyorsa

public class MyService : IMyService 
{ 
    private readonly HttpContext context; 

    public MyService(IHttpContextAccessor httpContextAccessor) 
    { 
     if(IHttpContextAccessor==null) 
      throw new ArgumentNullException(nameof(httpContextAccessor)); 

     context = httpContextAccessor.HttpContext; 
    } 
} 

Ancak, bir fabrika oluşturmak ve fabrikaya

public class MyServiceFactory : IMyServiceFactory 
{ 
    // injecting the HttpContext for request wide service resolution 
    public MyServiceFactory(IHttpContextAccessor httpContextAccessor) { ... } 
    public IMyService Create(IDependency1 dep1, IDependency2 dep 2, string someRuntimeConfig) 
    { 
     IServiceProvider provider = this.context.RequestServices; 

     var myService = new MyService(provider.GetService<ISomeRepository>(), dep1, dep2, someRuntimeConfig); 
     return myService; 
    } 
} 

parametrelerini geçirmek ve ardından IMyServiceFactory enjekte edebilirsiniz IMyService'a ihtiyacınız olan sınıflar.

İlgili konular