2016-03-23 10 views
1

私は、組み込みのDIフレームワークを使用してasp.netコアにアプリケーションを持っています。リクエストごとに(つまり一時的な)サービスをプロバイダに追加したいのですが、実際にそのリクエストをその構築に利用したいと思います。リクエストからの情報を使用したAddTransientサービス

services.AddTransient<IMyService>(provider => { ... }); 

私は見つけることができる最も近いオーバーロードだが、providerオブジェクトは現在のリクエストについては何もありません。より堅牢なDIフレームワークにアップグレードせずに、私がやろうとしていることを達成する方法はありますか?

+1

btw。要求サービスごとに 'AddTransient'ではなく' AddScope'を使用します。 'AddTransient'はすべての解決のために新しいインスタンスを作成します。つまり、同じリポジトリを使用して2つのサービスを両方注入すると、両方のサービスはリポジトリの独自のインスタンスを取得します。 – Tseng

+0

サービス内で何が必要なのかを指定できますか? 'HttpContext'?それとも別の何か? 'HttpContext'は簡単に注入することができます。他のものを手に入れるのは少し難しいかもしれません。 – Tseng

+0

' HttpContext'は十分であるべきだと思っています。あなたは完全に正しいです。私は 'AddTransient'ではなく' AddScoped'を使うつもりです。私は現在AFKですが、 'AddScoped'は私が探しているオーバーロードを持っていますか? – gzak

答えて

1

HttpContextが必要な場合は、コメントに掲載されているように、IHttpContextAccessorをサービスに挿入してアクセスすることができます。

public class MyService : IMyService 
{ 
    private readonly HttpContext context; 

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

     context = httpContextAccessor.HttpContext; 
    } 
} 

あなたはコントローラやHttpContextの外でのみ利用可能です何かを必要とする場合は、あなたが工場を作成し、工場

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; 
    } 
} 

にパラメータを渡し、その後、あなたにIMyServiceFactoryを注入することができますあなたが必要とするクラスIMyService

関連する問題