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

net core WebApi——依赖注入Autofac

程序员文章站 2023-10-29 10:11:10
[toc] 前言 周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了。 Autofac 这个第三方类库呢,是Ioc的容器,可以简化我们很大的工作量,比如说在之前我 ......

前言

周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了。

autofac

这个第三方类库呢,是ioc的容器,可以简化我们很大的工作量,比如说在之前我们需要写个类去声明接口与实现,而用了这个容器呢,就不需要了,当然还是需要些配置的。

首先,引入第三方类库,不多说。

net core WebApi——依赖注入Autofac

然后开始配置吧,首先先来看program,添加autofacserviceproviderfactory

        public static ihostbuilder createhostbuilder(string[] args) =>
            host.createdefaultbuilder(args)
                .configurewebhostdefaults(webbuilder =>
                {
                    webbuilder.usestartup<startup>();
                })
                .useserviceproviderfactory(new autofacserviceproviderfactory());

改完之后呢,我们果断就来到了startup,只要是配置,当然要看入口文件跟这个配置文件了。

3.x呢有个变化就是autofac要通过configurecontainer这个传入容器的方法来配置了,不需要自己再创建。

        private static readonly list<string> _assemblies = new list<string>()
        {
            "april.service"
        };
        public void configurecontainer(containerbuilder container)
        {
            var assemblys = _assemblies.select(x => assembly.load(x)).tolist();
            list<type> alltypes = new list<type>();
            assemblys.foreach(aassembly =>
            {
                alltypes.addrange(aassembly.gettypes());
            });

            // 通过autofac自动完成依赖注入
            container.registertypes(alltypes.toarray())
                .asimplementedinterfaces()
                .propertiesautowired()
                .instanceperdependency();

            // 注册controller
            container.registerassemblytypes(typeof(startup).gettypeinfo().assembly)
                .where(t => typeof(controller).isassignablefrom(t) && t.name.endswith("controller", stringcomparison.ordinal))
                .propertiesautowired();
        }

通过registertypes的注册方法将对应工程,也就是april.service下的类接口与实现自动绑定,当然你也可以通过注册接口的方法一个个来,但是我懒,比如:

// 一个
builder.registertype<studentservice>().as<istudentservice>();
// 一对多
builder.registertype<studentservice>().as<istudentservice>().as<itestservice>();

这里注意,声明绑定一般是一对一,当然也可以是一对多,如果多次注册声明一个类,会取最后一次注册的声明作为实际操作的类。

好了,配置完成之后,我们来试下效果吧(当然我是已经注释掉之前的serviceinjection这个声明方法了)。

在我们访问values的时候,我们看下istudentservice是否是null。
net core WebApi——依赖注入Autofac

ok,这已经说明通过autofac这个容器,已经完成了一个工程里面的接口与实现的依赖关系了。

添加一个util来随时调用

在接触的朋友中,有人给我反馈个信息,我不想每次写方法都要构造函数来传接口方法给我,也就是说我不要你觉得,我要我觉得。

好啊,你觉得方法自己要啥拿啥,可以,来个util吧。

    public class autofacutil
    {
        public static ilifetimescope container { get; set; }

        /// <summary>
        /// 获取服务(single)
        /// </summary>
        /// <typeparam name="t">接口类型</typeparam>
        /// <returns></returns>
        public static t getservice<t>() where t : class
        {
            return container.resolve<t>();
        }

        /// <summary>
        /// 获取服务(请求生命周期内)
        /// </summary>
        /// <typeparam name="t">接口类型</typeparam>
        /// <returns></returns>
        public static t getscopeservice<t>() where t : class
        {
            return (t)getservice<ihttpcontextaccessor>().httpcontext.requestservices.getservice(typeof(t));
        }
    }

在用之前,我们需要针对container来个声明实例化,startup中的configure添加下面一句。

            autofacutil.container = app.applicationservices.getautofacroot();

修改values中的一部分来通过实例化的方式来调用接口。

            istudentservice studentservice = autofacutil.getscopeservice<istudentservice>();

            studententity entity = new studententity
            {
                //新增
                name = "小明",
                age = 18,
                number = "007",
                sex = 0,
                address = "大洛阳"
            };

            studentservice.insert(entity);

让我们来看下效果吧。
net core WebApi——依赖注入Autofac

两种方法,看个人习惯吧,我是推荐通过注入的方式,通过构造函数的方式来获取接口实现。

小结

简单记录平时鼓捣的点点滴滴,有时候真是觉得,还是要多看多鼓捣,就像这个容器,在之前我通过一行一行的接口+实现来做绑定声明,现在呢,只需要改造下,就可以一键无脑实例化,第三方库的使用与否,个人觉得还是能踩着巨人的肩膀哪怕靠着也可以,自己一步步爬固然可嘉,也要学会变通,这样方能提高效率,路漫漫其修远兮

代码地址

注意切换到3.0的分支。
github
gitee

预告

april-admin,总算是要有个前后端联动的工程了,一个名副其实的基础工程。

前端基于ant design pro
后端当然是net core 3.1
net core WebApi——依赖注入Autofac