Autofac - My Choice of IoC Container
I have been using Unity for dependency injection since the early days of ASP.NET MVC framework. Recently I have evaluated other IoC containers and really impressed with Autofac. The next version of my codeplex project EFMVC will be use Autofac as IoC container. Autofac is a lightweight IoC container that providing better performance and can easily integrate with .NET applications. Autofac is developed by Nicholas Blumhardt and the community is actively working on the code base.
Using Autofac in ASP.NET MVC 3 Apps
Autofac provides better integration for ASP.NET MVC Framework.You can add the Autofac ASP.NET MVC3 Integration package using NuGet to working with MVC 3. The following command in the NuGet console will add Autofac and its ASP.NET MVC 3 integration components.
PM> Install-Package Autofac.Mvc3
Register components with Autofac
The following code block in the Application_Start() of Global.asax.cs will configure Autofac with ASP.NET MVC 3.
var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterType<CommandProcessor>().As<ICommandProcessor>(); builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest(); builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest(); builder.RegisterAssemblyTypes(typeof(CategoryRepository).Assembly) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces().InstancePerHttpRequest(); var tasks = Assembly.Load("EFMVC.Tasks"); builder.RegisterAssemblyTypes(tasks) .AsClosedTypesOf(typeof(ICommandHandler<>)).InstancePerHttpRequest(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Registering Controllers
The below code register all the controllers in an assembly
builder.RegisterControllers(Assembly.GetExecutingAssembly());
Register components
The following code will register components with container lifetime of Http Request
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest(); builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest();
Auto Registration
Autofac will automatically register your components by scanning assembly The following registration syntax will register all types in an assembly where type name is end with "Repository".
builder.RegisterAssemblyTypes(typeof(CategoryRepository).Assembly) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces().InstancePerHttpRequest();
The following registration syntax will scan the given assembly and will register all types that implemented the open generic type ICommandHandler<>
var tasks = Assembly.Load("EFMVC.Tasks"); builder.RegisterAssemblyTypes(tasks) .AsClosedTypesOf(typeof(ICommandHandler<>)).InstancePerHttpRequest();
Filter Attribute Property Injection
To make use of property injection in filter attributes, just call the RegisterFilterProvider method provided by Autofac.MVC3
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterFilterProvider();
Useful Links