7 Şubat 2022 Pazartesi

ASP.NET MVC Autofac Implementation

 Ö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.

void AutofacRegisterAssemblyTypesFolder()
        {
            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));
        }