これを行う方法は簡単ではありません。 ConfigureServices
メソッド以外のIServiceCollection
は変更できません。しかし、可能であれば、それは無用です。コンテナは、Configure
が呼び出される前に既に構築されているためです。
あなたができることは、ファクトリクラスを作成してスコープとして登録することです。
あなたのミドルウェアで次に
public interface IDataProviderFactory
{
bool UseInMemoryProvider { get; set; }
IDataProvider Create();
}
public class DataProviderFactory : IDataProviderFactory
{
private readonly IServiceProvider provider;
public bool UseInMemoryProvider { get; set; }
public DataProviderFactory(IServiceProvider provider)
{
this.provider = provider;
}
public IDataProvider Create()
{
if(UseInMemoryProvider)
{
return provider.RequestService<InMemoryDataProvider>();
}
return provider.RequestService<DbDataProvider>();
}
}
:
public class MyMiddleware
{
public void Invoke(HttpContext context)
{
var dataProviderFactory = context.RequestServices.RequestService<IDataProviderFactory>();
// Your logic here
if(...)
{
dataProviderFactory.UseInMemoryStore = true;
}
}
}
とあなたのコントローラ/サービス中:
public class MyController : Controller
{
private readonly IDataProvider dataProvider;
public MyController(IDataProviderFactory dataProviderFactory)
{
dataProvider = dataProviderFactory.Create();
}
}
ランタイム条件に基づいてサービスを注入しないようにする(実行時データ自体を注入しないようにする)(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)コンポーネント。代わりに、両方の実装で注入され、実行時に呼び出しを実装に転送する複合コンポーネントを使用します。工場は決して正しいソリューションではありません。 – Steven