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

NET Core 3.0 项目中使用 AutoFac

程序员文章站 2022-06-20 08:54:26
.net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.NET Core 3.1是长期支持(LTS)版本,建议大家升级。 .net core 2.2 这个月就要停止维护,并且微软将不再提供支持,如果你在使用 2.2 ,建议升级到 3.1 ......

.net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.net core 3.1是长期支持(lts)版本,建议大家升级。

.net core 2.2 这个月就要停止维护,并且微软将不再提供支持,如果你在使用 2.2 ,建议升级到 3.1,可以先升级到3.0,可以参考文档:

asp.net core 2.2 迁移到3.0:

如果在使用 2.1,可以暂时不用着急升级,2.1也是 lts 版本

NET Core 3.0 项目中使用 AutoFac

asp.net core 3.0的新增功能:

替换autofac服务

在 .net core 3.0 之前的时候,返回一个 iserviceprovider 注入到configureservices服务中。

用 .net core 3.0 框架运行之后会报错:configureservices returning an system.iserviceprovider isn't supported.

找文档之后发现 3.0 中 configureservices 已经不支持返回 iserviceprovider 。

.net core 2.2的写法

        /// <summary>
        /// //负责注入服务
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public iserviceprovider configureservices(iservicecollection services)
        {
            //初始化容器
            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();
            //注册仓储,所有irepository接口到repository的映射
            builder.registergeneric(typeof(repository<>))
                //instanceperdependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
                .as(typeof(irepository<>)).instanceperdependency();
            //构造
            applicationcontainer = builder.build();
            //将autofac反馈到管道中
            return new autofacserviceprovider(applicationcontainer);
        }

.net core 3.0的写法

修改 program.cs 将默认serviceproviderfactory指定为autofacserviceproviderfactory

    public class program
    {
        public static void main(string[] args)
        { 
            createhostbuilder(args).build().run();
        }

        public static ihostbuilder createhostbuilder(string[] args) =>
            host.createdefaultbuilder(args)
                 //将默认serviceproviderfactory指定为autofacserviceproviderfactory
                .useserviceproviderfactory(new autofacserviceproviderfactory())
                .configurewebhostdefaults(webbuilder =>
                {
                    webbuilder.usestartup<startup>();
                    webbuilder.useurls("http://*:8004");
                });
    }

然后在 startup.cs 中添加 configurecontainer 方法

使用configurecontainer访问autofac容器生成器,并直接向autofac注册。

        public void configurecontainer(containerbuilder builder)
        {
            //业务逻辑层所在程序集命名空间
            assembly service = assembly.load("netcoredemo.service");
            //接口层所在程序集命名空间
            assembly repository = assembly.load("netcoredemo.repository");
            //自动注入
            builder.registerassemblytypes(service, repository)
                .where(t => t.name.endswith("service"))
                .asimplementedinterfaces();
            //注册仓储,所有irepository接口到repository的映射
            builder.registergeneric(typeof(repository<>))
                //instanceperdependency:默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
                .as(typeof(irepository<>)).instanceperdependency();
        }

参考: