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
。
btw。要求サービスごとに 'AddTransient'ではなく' AddScope'を使用します。 'AddTransient'はすべての解決のために新しいインスタンスを作成します。つまり、同じリポジトリを使用して2つのサービスを両方注入すると、両方のサービスはリポジトリの独自のインスタンスを取得します。 – Tseng
サービス内で何が必要なのかを指定できますか? 'HttpContext'?それとも別の何か? 'HttpContext'は簡単に注入することができます。他のものを手に入れるのは少し難しいかもしれません。 – Tseng
' HttpContext'は十分であるべきだと思っています。あなたは完全に正しいです。私は 'AddTransient'ではなく' AddScoped'を使うつもりです。私は現在AFKですが、 'AddScoped'は私が探しているオーバーロードを持っていますか? – gzak