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

Apr 23, 2025 - 05:37
 0
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();
    }
}