using System; using System.Linq; using Autofac; using Autofac.Extensions.DependencyInjection; using Hncore.Infrastructure.IOC; using Microsoft.Extensions.DependencyInjection; using Hncore.Infrastructure.DDD; using Hncore.Infrastructure.EF; namespace Hncore.Infrastructure.Autofac { public class MvcAutoRegister { public IServiceProvider Build(IServiceCollection services, IMvcBuilder mvcBuilder, Action action = null) { mvcBuilder.AddControllersAsServices(); var builder = new ContainerBuilder(); var assemblys = AppDomain.CurrentDomain.GetAssemblies().ToArray(); var perRequestType = typeof(IPerRequest); builder.RegisterAssemblyTypes(assemblys) .Where(t => perRequestType.IsAssignableFrom(t) && t != perRequestType) .PropertiesAutowired() .AsImplementedInterfaces() .InstancePerLifetimeScope(); var perDependencyType = typeof(IDependency); builder.RegisterAssemblyTypes(assemblys) .Where(t => perDependencyType.IsAssignableFrom(t) && t != perDependencyType) .PropertiesAutowired() .AsImplementedInterfaces() .InstancePerDependency(); var singleInstanceType = typeof(ISingleInstance); builder.RegisterAssemblyTypes(assemblys) .Where(t => singleInstanceType.IsAssignableFrom(t) && t != singleInstanceType) .PropertiesAutowired() .AsImplementedInterfaces() .SingleInstance(); builder.RegisterGeneric(typeof(QueryBase<,>)).As(typeof(IQuery<,>)).PropertiesAutowired() .InstancePerLifetimeScope(); builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepository<,>)).PropertiesAutowired() .InstancePerLifetimeScope(); action?.Invoke(builder); builder.Populate(services); var container = builder.Build(); var servicesProvider = new AutofacServiceProvider(container); return servicesProvider; } } }