.net core 2.0 Autofac

参考自 https://github.com/VictorTzeng/Zxw.Framework.NetCore
安装Autofac,在`project.csproj`加入
<PackageReference Include="Autofac.Configuration" Version="4.0.1" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.2.2" />
在`Startup.cs`中创建一个`public IContainer ApplicationContainer { get; private set; }`对象,并把`ConfigureServices`返回类型改为`IServiceProvider`
上下文是用内置IOC创建,**将void的返回值改为`IServiceProvide`**
控制器不能从容器中解析出来; 只是控制器构造函数参数。这意味着控制器生命周期,属性注入和其他事情不由Autofac管理 - 它们由ASP.NET Core管理。可以通过指定AddControllersAsServices()何时向服务集合注册MVC 来更改此设置`services.AddMvc().AddControllersAsServices();`。可以在填充服务之后覆盖控制器注册
`InstancePerRequest`由`InstancePerLifetimeScope`替代
 public IContainer ApplicationContainer { get; private set; }
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddSession(a => 
                {
                    a.IdleTimeout = TimeSpan.FromMinutes(20);
                    a.Cookie.HttpOnly = true;
                });
            services.AddDistributedRedisCache(o => o.Configuration = Configuration.GetConnectionString("Redis"));
            //Add controllers as services so they'll be resolved.
            services.AddMvc().AddControllersAsServices().AddJsonOptions(options => {
                //忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                //不使用驼峰样式的key
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //设置时间格式
                options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
            });        
            return InitIoC(services);
        }

在Startup.cs添加方法

/// <summary>
        /// IoC初始化
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        private IServiceProvider InitIoC(IServiceCollection services)
        {
            IocContainer.Register(Configuration);//注册配置
            IocContainer.Register(typeof(BlogContext));//注册EF上下文
            IocContainer.Register(Assembly.GetExecutingAssembly());//注册controller
            return IocContainer.Build(services);
        }

IocContainer自定义类

/// <summary>
    /// Autofac Ioc容器
    /// </summary>
    public class IocContainer
    {
        private static ContainerBuilder _builder = new ContainerBuilder();
        private static IContainer _container;
        private static string[] _otherAssembly;
        private static List<Type> _types = new List<Type>();
        private static Assembly _assName;

        private static Dictionary<Type, Type> _dicTypes = new Dictionary<Type, Type>();

        /// <summary>
        /// 注册程序集
        /// </summary>
        /// <param name="assemblies">程序集名称的集合</param>
        public static void Register(params string[] assemblies)
        {
            _otherAssembly = assemblies;
        }

        /// <summary>
        /// 注册类型
        /// </summary>
        /// <param name="types"></param>
        public static void Register(params Type[] types)
        {
            _types.AddRange(types.ToList());
        }
        /// <summary>
        /// 注册程序集。
        /// </summary>
        /// <param name="implementationAssemblyName"></param>
        /// <param name="interfaceAssemblyName"></param>
        public static void Register(string implementationAssemblyName, string interfaceAssemblyName)
        {
            var implementationAssembly = Assembly.Load(implementationAssemblyName);
            var interfaceAssembly = Assembly.Load(interfaceAssemblyName);
            var implementationTypes =
                implementationAssembly.DefinedTypes.Where(t =>
                    t.IsClass && !t.IsAbstract && !t.IsGenericType && !t.IsNested);
            foreach (var type in implementationTypes)
            {
                var interfaceTypeName = interfaceAssemblyName + ".I" + type.Name;
                var interfaceType = interfaceAssembly.GetType(interfaceTypeName);
                if (interfaceType.IsAssignableFrom(type))
                {
                    _dicTypes.Add(interfaceType, type);
                }
            }
        }
        /// <summary>
        /// 注册dal、controller
        /// </summary>
        /// <param name="ass"></param>
        public static void Register(Assembly ass){
            _assName = ass;
        }
        /// <summary>
        /// 注册
        /// </summary>
        /// <typeparam name="TInterface"></typeparam>
        /// <typeparam name="TImplementation"></typeparam>
        public static void Register<TInterface, TImplementation>() where TImplementation : TInterface
        {
            _dicTypes.Add(typeof(TInterface), typeof(TImplementation));
        }

        /// <summary>
        /// 注册一个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="instance"></param>
        public static void Register<T>(T instance) where T:class
        {
            _builder.RegisterInstance(instance).SingleInstance();
        }

        /// <summary>
        /// 构建IOC容器,需在各种Register后调用。
        /// </summary>
        public static IServiceProvider Build(IServiceCollection services)
        {
            if (_otherAssembly != null)
            {
                foreach (var item in _otherAssembly)
                {
                    _builder.RegisterAssemblyTypes(Assembly.Load(item));
                }
            }

            if (_types != null)
            {
                foreach (var type in _types)
                {
                    _builder.RegisterType(type).InstancePerLifetimeScope();
                }
            }

            if (_dicTypes != null)
            {
                foreach (var dicType in _dicTypes)
                {
                    _builder.RegisterType(dicType.Value).As(dicType.Key);
                }
            }
            _builder.Populate(services);
            //you can override the controller registration after populating services.
            if(_assName!=null){
                _builder.RegisterAssemblyTypes(_assName).Where(t => t.Name.ToLower().EndsWith("dal")).PropertiesAutowired().InstancePerLifetimeScope();
                _builder.RegisterAssemblyTypes(_assName).Where(t => t.Name.ToLower().EndsWith("controller")).PropertiesAutowired().InstancePerLifetimeScope();
            }
            _container = _builder.Build();
            return new AutofacServiceProvider(_container);
        }

        /// <summary>
        /// Resolve an instance of the default requested type from the container
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <returns></returns>
        public static T Resolve<T>()
        {
            return _container.Resolve<T>();
        }
    }
原文地址:https://www.cnblogs.com/xiaonangua/p/9176410.html