Öncelikle Autofac.Mvc5 Nuget Paketi projeye dahil edilmeli.
Daha sonra global.asax içinde Application_Start() metodunda aşağıdaki metod çağrılırsa Autofac da registration yapılır. Ayrıca MVC controllerlarda constructor da Dependency Injection için de AutofacDependencyResolver set edilmiş olur.
{
var dir = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath);
var files = Directory.EnumerateFiles(dir);
var types = files
.Where(fileName => fileName.EndsWith("WebApplicationAutofac.dll") || fileName.EndsWith("MyDomain.dll"))
.Select(filePath => Assembly.LoadFrom(filePath))
.SelectMany(assembly => assembly.GetTypes())
.Where(type => type.IsClass == true)
.Where(type => type.FullName.StartsWith("WebApplicationAutofac.Domain") || type.FullName.StartsWith("MyDomain"));
//.Where(type => type.GetInterfaces().Length > 0);
var builder = new ContainerBuilder();
var asm = Assembly.GetExecutingAssembly();
builder.RegisterControllers(asm);
//type registration
//builder.RegisterType<Service>().As<IService>();
//register interceptor
builder.Register(c => new LogInterceptor());
//oluşturulan instance register edilir. her talep edildiğinde aynı instance verilir. singleton çalışır
builder.RegisterInstance(new InstanceDomain()).As<InstanceDomain>();
//belirtilen assemblydeki registerlar
foreach (var type in types)
{
var interfaces = type.GetInterfaces();
if (interfaces.Length > 0)
{
builder.RegisterType(type).As(interfaces[0])
.IfNotRegistered(type)
.EnableInterfaceInterceptors()
.InterceptedBy(typeof(LogInterceptor));
}
else
{
builder.RegisterType(type).AsSelf()
.IfNotRegistered(type);
}
}
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}