Implementing ServiceLocator in middleware
Before I begin, I'm aware the Service Locator pattern is not recommended and it's better to inject services into the classes where they are used. However, I have a large legacy codebase that creates a lot of objects inside methods without DI. Refactoring this would be a monumental task so I am trying to implement a static Service Locator as reasonably as possible. My idea is to create a scope as part of a request middleware and set the ServiceLocator instance here. Then allow it to flow through the rest of the request chain before it exists and disposes. I have tested this and my created class is disposed, so it seems to be working as expected. Are there any pitfalls I haven't considered? public class DependencyLocatorHandler(RequestDelegate next, IServiceProvider serviceProvider) { public async Task InvokeAsync(HttpContext context) { await using var serviceProviderScope = serviceProvider.CreateAsyncScope(); ServiceLocator.SetServiceProvider(serviceProviderScope.ServiceProvider); await next(context); } } public static class ServiceLocator { private static IServiceProvider _serviceProvider; public static void SetServiceProvider(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public static T GetService() { return _serviceProvider.GetService(); } }

Before I begin, I'm aware the Service Locator pattern is not recommended and it's better to inject services into the classes where they are used. However, I have a large legacy codebase that creates a lot of objects inside methods without DI. Refactoring this would be a monumental task so I am trying to implement a static Service Locator as reasonably as possible.
My idea is to create a scope as part of a request middleware and set the ServiceLocator instance here. Then allow it to flow through the rest of the request chain before it exists and disposes. I have tested this and my created class is disposed, so it seems to be working as expected. Are there any pitfalls I haven't considered?
public class DependencyLocatorHandler(RequestDelegate next, IServiceProvider serviceProvider)
{
public async Task InvokeAsync(HttpContext context)
{
await using var serviceProviderScope = serviceProvider.CreateAsyncScope();
ServiceLocator.SetServiceProvider(serviceProviderScope.ServiceProvider);
await next(context);
}
}
public static class ServiceLocator
{
private static IServiceProvider _serviceProvider;
public static void SetServiceProvider(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public static T GetService()
{
return _serviceProvider.GetService();
}
}