net core WebApi——依賴注入Autofac

前言

週末加班,下午犯困,整理下以前鼓搗過的東西,看過我以前的webapi系列的讀者知道,我以前試過Aspect,可是升級到3.0以後沒往下去試了,當時還留了個坑,這不,如今果斷移除了換成這個了。git

Autofac

這個第三方類庫呢,是Ioc的容器,能夠簡化咱們很大的工做量,好比說在以前咱們須要寫個類去聲明接口與實現,而用了這個容器呢,就不須要了,固然仍是須要些配置的。github

首先,引入第三方類庫,很少說。web

引入

而後開始配置吧,首先先來看Program,添加AutofacServiceProviderFactory後端

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

改完以後呢,咱們果斷就來到了Startup,只要是配置,固然要看入口文件跟這個配置文件了。api

3.x呢有個變化就是Autofac要經過ConfigureContainer這個傳入容器的方法來配置了,不須要本身再建立。app

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下的類接口與實現自動綁定,固然你也能夠經過註冊接口的方法一個個來,可是我懶,好比:ide

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

這裏注意,聲明綁定通常是一對一,固然也能夠是一對多,若是屢次註冊聲明一個類,會取最後一次註冊的聲明做爲實際操做的類。函數

好了,配置完成以後,咱們來試下效果吧(固然我是已經註釋掉以前的ServiceInjection這個聲明方法了)。測試

在咱們訪問Values的時候,咱們看下IStudentService是不是null。
測試

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

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

兩種方法,看我的習慣吧,我是推薦經過注入的方式,經過構造函數的方式來獲取接口實現。

小結

簡單記錄平時鼓搗的點點滴滴,有時候真是以爲,仍是要多看多鼓搗,就像這個容器,在以前我經過一行一行的接口+實現來作綁定聲明,如今呢,只須要改造下,就能夠一鍵無腦實例化,第三方庫的使用與否,我的以爲仍是能踩着巨人的肩膀哪怕靠着也能夠,本身一步步爬當然可嘉,也要學會變通,這樣方能提升效率,路漫漫其修遠兮

代碼地址

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

預告

April-Admin,總算是要有個先後端聯動的工程了,一個名副其實的基礎工程。

前端基於Ant Design Pro
後端固然是net core 3.1
預覽

相關文章
相關標籤/搜索