欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

netcore 2.2 使用 Autofac 实现自动注入

程序员文章站 2022-06-29 13:59:06
Autofac自动注入是通过名称约定来实现依赖注入 ps:本demo接口层都以“I”开头,以“Service”结尾。服务层实现都以“Service”结尾。 为什么要实现自动注入 大多时候,我们都是 以下方式进行依赖注入 public IServiceProvider ConfigureService ......

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;
        }
    }

运行

netcore 2.2 使用 Autofac 实现自动注入