Skip to content

Instantly share code, notes, and snippets.

@chrcar01
Created October 26, 2023 02:11
Show Gist options
  • Save chrcar01/35d87d41e23ed362f82d9a06fbdab08d to your computer and use it in GitHub Desktop.
Save chrcar01/35d87d41e23ed362f82d9a06fbdab08d to your computer and use it in GitHub Desktop.
MVC 4 Dependency Injection using Microsoft's ServiceProvider
/// <summary>
/// Wires up everything needed for dependency injection in mvc controllers.
/// Ripped from SO: https://stackoverflow.com/a/68873916
/// </summary>
public class DependencyInjectionConfig
{
public static void Configure(ControllerBuilder controllerBuilder)
{
var services = new ServiceCollection();
services.AddTransient<HomeController>();
services.AddSingleton<IHomeService, HomeService>();
var provider = services.BuildServiceProvider(new ServiceProviderOptions
{
ValidateOnBuild = true,
ValidateScopes = true
});
controllerBuilder.SetControllerFactory(new MsDiControllerFactory(provider));
}
}
/// <summary>
/// Implementation of <see cref="DefaultControllerFactory"/> using Microsoft's <see cref="ServiceProvider"/>.
/// </summary>
public class MsDiControllerFactory : DefaultControllerFactory
{
private readonly ServiceProvider _provider;
public MsDiControllerFactory(ServiceProvider provider) => _provider = provider;
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
IServiceScope scope = _provider.CreateScope();
HttpContext.Current.Items[typeof(IServiceScope)] = scope;
return (IController)scope.ServiceProvider.GetRequiredService(controllerType);
}
public override void ReleaseController(IController controller)
{
base.ReleaseController(controller);
var scope = HttpContext.Current.Items[typeof(IServiceScope)] as IServiceScope;
scope?.Dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment