One of the capabilities of Autofac is the integration with the ASP.NET applications.
ASP.NET MVC is a framework thinked to supports the dependency injection, and so we can use Autofac to register the modules that compose the application, such as the controllers.
Therefore, let’s start by implementing the controllers of the application, then we ‘ll add the Autofac module that define the controllers registration.
Controllers
We implement two controllers, a Controller and an ApiController:
public class HomeController : Controller { LoggerService _loggerService; public HomeController(LoggerService loggerService) { _loggerService = loggerService; } }
The second one is the Web Api:
public class AccountController : ApiController { LoggerService _loggerService; public AccountController(LoggerService loggerService) { _loggerService = loggerService; } }
Autofac module
The first step is install the two autofac packages needed for the integration with ASP.NET:
install-package Autofac.Integration.Mvc install-package Autofac.Integration.WebApi
Now we can register the controllers with an Autofac module:
public class PerRequestModule : Module { protected override void Load(ContainerBuilder builder) { var controllersAssembly = Assembly.GetAssembly(typeof(HomeController)); var apiControllersAssembly = Assembly.GetAssembly(typeof(AccountController)); builder.RegisterControllers(controllersAssembly); builder.RegisterApiControllers(apiControllersAssembly); } }
By using the reflection, we can register all the controllers in one shot.
The module needs to be registered in the autofac container:
var builder = new ContainerBuilder(); .... builder.RegisterModule(new PerRequestModule()); ... containerBuilder = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(containerBuilder)); httpConfiguration = new HttpConfiguration { DependencyResolver = new AutofacWebApiDependencyResolver(containerBuilder) };
We built the container and passed that to the AutofacDependencyResolver (Controller) and to the AutofacWebApiDependencyResolver (ApiController).
Tests
Now we can implement the test methods:
public class PerRequestTests : BaseTests { [Test] public void should_be_able_to_resolve_mvc_controller() { using (var scope = containerBuilder.BeginLifetimeScope()) { var controller = scope.Resolve<HomeController>(); controller.Should().NotBeNull(); } } [Test] public void should_be_able_to_resolve_api_controller() { using (var scope = containerBuilder.BeginLifetimeScope()) { var controller = scope.Resolve<AccountController>(); controller.Should().NotBeNull(); } } }
As you can see, we initialized a new lifetime scope and tried to resolve the controllers.
You can find the source code here.
Leave a Reply