autofac自动注入是通过名称约定来实现依赖注入

ps:本demo接口层都以“i”开头,以“service”结尾。服务层实现都以“service”结尾。

为什么要实现自动注入

大多时候,我们都是 以下方式进行依赖注入

        public iserviceprovider configureservices(iservicecollection services)
        {
            services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);
            //初始化容器
            var builder = new containerbuilder();
            //管道寄居
            builder.populate(services);
            builder.registertype<testservice>().as<itestservice>();//userservice注入到iuserservice
            //构造
            applicationcontainer = builder.build();
            //将autofac反馈到管道中
            return new autofacserviceprovider(applicationcontainer);
        }

随着业务的增长,接口跟实现类会越来越多,还需要手动一个个的注册依赖项,有时候会出现忘了写配置,导致程序报错,如果是多人开发,可能还会导致代码冲突,后期维护起来相对来说比较麻烦。

实用autofac自动注入

        public iserviceprovider configureservices(iservicecollection services)
        {
            services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);
            //初始化容器
            var builder = new containerbuilder();
            //管道寄居
            builder.populate(services);
            //业务逻辑层所在程序集命名空间
            assembly service = assembly.load("netcoredemo.service");
            //接口层所在程序集命名空间
            assembly repository = assembly.load("netcoredemo.repository");
            //自动注入
            builder.registerassemblytypes(service, repository)
                .where(t => t.name.endswith("service"))
                .asimplementedinterfaces();
            //构造
            applicationcontainer = builder.build();
            //将autofac反馈到管道中
            return new autofacserviceprovider(applicationcontainer);
        }

简单测试

创建iuserservice接口

    public interface itestservice
    {
        string hello();
    }

创建userservice实现类

    public class testservice : itestservice
    {
        public string hello()
        {
            return "hello word";
        }
    }

创建testcontroller控制器

通过控制器的构造方法注入itestservice接口

    [route("api/test")]
    [apicontroller]
    public class testcontroller : controller
    {
        private readonly itestservice _testservice;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="testservice"></param>
        public testcontroller(itestservice testservice)
        {
            _testservice = testservice;
        }
        [httpget]
        public string hello()
        {
           var str= _testservice.hello();
           return str;
        }
    }

运行