小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

net core WebApi——依賴注入Autofac

 新進(jìn)小設(shè)計(jì) 2021-04-18

周末加班,下午犯困,整理下之前鼓搗過的東西,看過我之前的webapi系列的讀者知道,我之前試過Aspect,但是升級(jí)到3.0之后沒往下去試了,當(dāng)時(shí)還留了個(gè)坑,這不,現(xiàn)在果斷移除了換成這個(gè)了。

Autofac

這個(gè)第三方類庫呢,是Ioc的容器,可以簡化我們很大的工作量,比如說在之前我們需要寫個(gè)類去聲明接口與實(shí)現(xiàn),而用了這個(gè)容器呢,就不需要了,當(dāng)然還是需要些配置的。

首先,引入第三方類庫,不多說。

引入

然后開始配置吧,首先先來看Program,添加AutofacServiceProviderFactory

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .UseServiceProviderFactory(new AutofacServiceProviderFactory());

改完之后呢,我們果斷就來到了Startup,只要是配置,當(dāng)然要看入口文件跟這個(gè)配置文件了。

3.x呢有個(gè)變化就是Autofac要通過ConfigureContainer這個(gè)傳入容器的方法來配置了,不需要自己再創(chuàng)建。

        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自動(dòng)完成依賴注入
            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的注冊方法將對應(yīng)工程,也就是April.Service下的類接口與實(shí)現(xiàn)自動(dòng)綁定,當(dāng)然你也可以通過注冊接口的方法一個(gè)個(gè)來,但是我懶,比如:

// 一個(gè)
builder.RegisterType<StudentService>().As<IStudentService>();
// 一對多
builder.RegisterType<StudentService>().As<IStudentService>().As<ITestService>();

這里注意,聲明綁定一般是一對一,當(dāng)然也可以是一對多,如果多次注冊聲明一個(gè)類,會(huì)取最后一次注冊的聲明作為實(shí)際操作的類。

好了,配置完成之后,我們來試下效果吧(當(dāng)然我是已經(jīng)注釋掉之前的ServiceInjection這個(gè)聲明方法了)。

在我們訪問Values的時(shí)候,我們看下IStudentService是否是null。
測試

OK,這已經(jīng)說明通過Autofac這個(gè)容器,已經(jīng)完成了一個(gè)工程里面的接口與實(shí)現(xiàn)的依賴關(guān)系了。

添加一個(gè)Util來隨時(shí)調(diào)用

在接觸的朋友中,有人給我反饋個(gè)信息,我不想每次寫方法都要構(gòu)造函數(shù)來傳接口方法給我,也就是說我不要你覺得,我要我覺得。

好啊,你覺得方法自己要啥拿啥,可以,來個(gè)Util吧。

    public class AutofacUtil
    {
        public static ILifetimeScope Container { get; set; }

        /// <summary>
        /// 獲取服務(wù)(Single)
        /// </summary>
        /// <typeparam name="T">接口類型</typeparam>
        /// <returns></returns>
        public static T GetService<T>() where T : class
        {
            return Container.Resolve<T>();
        }

        /// <summary>
        /// 獲取服務(wù)(請求生命周期內(nèi))
        /// </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來個(gè)聲明實(shí)例化,Startup中的Configure添加下面一句。

            AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot();

修改Values中的一部分來通過實(shí)例化的方式來調(diào)用接口。

            IStudentService studentService = AutofacUtil.GetScopeService<IStudentService>();

            StudentEntity entity = new StudentEntity
            {
                //新增
                Name = "小明",
                Age = 18,
                Number = "007",
                Sex = 0,
                Address = "大洛陽"
            };

            studentService.Insert(entity);

讓我們來看下效果吧。
測試

兩種方法,看個(gè)人習(xí)慣吧,我是推薦通過注入的方式,通過構(gòu)造函數(shù)的方式來獲取接口實(shí)現(xiàn)。

小結(jié)

簡單記錄平時(shí)鼓搗的點(diǎn)點(diǎn)滴滴,有時(shí)候真是覺得,還是要多看多鼓搗,就像這個(gè)容器,在之前我通過一行一行的接口+實(shí)現(xiàn)來做綁定聲明,現(xiàn)在呢,只需要改造下,就可以一鍵無腦實(shí)例化,第三方庫的使用與否,個(gè)人覺得還是能踩著巨人的肩膀哪怕靠著也可以,自己一步步爬固然可嘉,也要學(xué)會(huì)變通,這樣方能提高效率,路漫漫其修遠(yuǎn)兮

代碼地址

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

預(yù)告

April-Admin,總算是要有個(gè)前后端聯(lián)動(dòng)的工程了,一個(gè)名副其實(shí)的基礎(chǔ)工程。

前端基于Ant Design Pro
后端當(dāng)然是net core 3.1
預(yù)覽

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多