没有简单或干净的方法可以做到这一点。您不能修改方法的IServiceCollection
外部ConfigureServices
。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();
}
}