microsoft/integrating-autofac-with-dotnet
> Migrates Autofac dependency injection configuration from ASP.NET Framework to ASP.NET Core's hosting model while keeping Autofac as the DI container. Use when upgrading projects that use Autofac, migrating Global.asax.cs or Startup.cs DI setup to Program.cs, or integrating AutofacServiceProviderFactory with the generic host. Triggers for Autofac container registration, UseServiceProviderFactory, ContainerBuilder migration, and DependencyResolver removal.
npx skills add https://github.com/microsoft/upgrade-agent-plugins --skill integrating-autofac-with-dotnet
When migrating from ASP.NET Framework to ASP.NET Core, Autofac integration changes significantly. The old pattern of manually building a container and setting DependencyResolver is replaced by registering Autofac as the host's service provider factory. This ensures Autofac participates in the standard DI lifecycle rather than bypassing it.
> Related skill: If the goal is to remove Autofac entirely and replace with built-in DI, use migrating-autofac-to-dotnet-di instead.
Migration Progress:
- [ ] Step 1: Verify Autofac usage
- [ ] Step 2: Install required package
- [ ] Step 3: Locate and extract existing registrations
- [ ] Step 4: Register Autofac as service provider factory
- [ ] Step 5: Migrate container registrations
- [ ] Step 6: Remove obsolete integration code
- [ ] Step 7: Validate
Program.cs already calls UseServiceProviderFactory(new AutofacServiceProviderFactory()). If so, verify the container configuration is correct and skip remaining steps.Install Autofac.Extensions.DependencyInjection with a version matching the project's target framework. This package provides the AutofacServiceProviderFactory bridge between Autofac and the .NET hosting model.
Search for Autofac registration code that builds a container — typically in Global.asax.cs, Startup.cs, or other top-level initialization classes. Record all ContainerBuilder registrations and module registrations before removing that code.
> Why remove first? The old code manually calls builder.Build() and sets a DependencyResolver, which conflicts with the host-managed container lifecycle in ASP.NET Core.
Add to Program.cs:
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
Move all extracted registrations into a ConfigureContainer block in Program.cs:
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterType<MyService>().As<IMyService>();
containerBuilder.RegisterModule(new MyAutofacModule());
});
Omit any calls to builder.Build() or resolver setup — the host handles container building automatically.
Delete ASP.NET Framework-specific Autofac wiring such as:
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));GlobalConfiguration.Configuration.DependencyResolver = resolver;ContainerBuilder.Build() calls in startup codeBefore (Global.asax.cs or Startup.cs):
var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IMyService>();
builder.RegisterType<MyRepository>().As<IRepository>();
builder.RegisterModule<MyModule>();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
After (Program.cs):
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterType<MyService>().As<IMyService>();
containerBuilder.RegisterType<MyRepository>().As<IRepository>();
containerBuilder.RegisterModule<MyModule>();
});
var app = builder.Build();
Autofac.Extensions.DependencyInjection package installedUseServiceProviderFactory configured in Program.csConfigureContainer blockDependencyResolver and manual Build() calls removedTake microsoft/integrating-autofac-with-dotnet from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.