1. 程式人生 > >net core WebApi——依賴注入Autofac

net core WebApi——依賴注入Autofac

目錄

  • 前言
  • Autofac
  • 新增一個Util來隨時呼叫
  • 小結
  • 程式碼地址
  • 預告

前言

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

Autofac

這個第三方類庫呢,是Ioc的容器,可以簡化我們很大的工作量,比如說在之前我們需要寫個類去宣告介面與實現,而用了這個容器呢,就不需要了,當然還是需要些配置的。

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

然後開始配置吧,首先先來看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。

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了

相關推薦

net core WebApi——依賴注入Autofac

目錄 前言 Autofac 新增一個Util來隨時呼叫 小結 程式碼地址 預告 前言 週末加班,下午犯困,整理下之前鼓搗過的東西,看過我之前的we

【半小時大話.net依賴注入】(下)詳解AutoFac+實戰Mvc、Api以及.NET Core依賴注入

系列目錄 第一章|理論基礎+實戰控制檯程式實現AutoFac注入 第二章|AutoFac的使用技巧 第三章|實戰Asp.Net Framework Web程式實現AutoFac注入 第四章|實戰Asp.Net Core自帶DI實現依賴注入 第五章|實戰Asp.Net Core引入AutoFac的兩種方式

.net core依賴注入容器獲取物件

建立引擎方法:改方法用於在不使用構造注入的情況下從依賴注入容器中獲取物件 /// <summary> /// 一個負責建立物件的引擎 /// </summary> public interface IEngine { T Res

asp.net core ioc 依賴注入

1.生命週期 內建的IOC有三種生命週期: Transient: Transient服務在每次被請求時都會被建立。這種生命週期比較適用於輕量級的無狀態服務。 Scoped: Scoped生命週期的服務是每次web請求被建立。 Singleton: Singleton生命能夠週期服務在第一被請求時建立,在後續

.NET Core依賴注入[1]: 控制反轉

寫在前面:我之前寫過一系列關於.NET Core依賴注入的文章,由於.NET Core依賴注入框架的實現原理髮生了很大的改變,加上我對包括IoC和DI這些理論層面的東西又有了一些新的理解,所以我在此基礎上寫了8篇文章詳細介紹.NET Core的DI。我將這些文章釋出到我的微信公眾賬號(大內老A)下,很多人留言

.Net Core依賴注入服務使用總結

一、依賴注入   引入依賴注入的目的是為了解耦和。說白了就是面向介面程式設計,通過呼叫介面的方法,而不直接例項化物件去呼叫。這樣做的好處就是如果添加了另一個種實現類,不需要修改之前程式碼,只需要修改注入的地方將實現類替換。上面的說的通過介面呼叫方法,實際上還是需要去例項化介面的實現類,只不過不需要我們手動n

.net core 依賴注入, autofac 簡單使用

綜述 ASP.NET Core  支援依賴注入, 也推薦使用依賴注入. 主要作用是用來降低程式碼之間的耦合度.  什麼是控制反轉? 控制反轉(Inversion of Control,縮寫為IoC),是面向物件程式設計中的一種設計原則,可以用來減低計算機程式碼之間的耦合度。 其中最常見的方

使用 .NET Core 實現依賴關係注入

為什麼使用依賴關係注入? 使用 .NET,通過 new 運算子(即,new MyService 或任何想要例項化的物件型別)呼叫建構函式即可輕鬆實現物件例項化。遺憾的是,此類呼叫會強制實施客戶端(或應用程式)程式碼到已例項化物件的緊密耦合的連線(硬編碼的引用),此外

Asp.Net Core WebAPI入門整理(二)簡單示例

序列 open exc tor pda template ssa net found 一、Core WebAPI中的序列化 使用的是Newtonsoft.Json,自定義全局配置處理: // This method gets called by the runtime.

Asp.Net Core WebAPI入門整理(三)跨域處理

使用 所有 ble 允許 需要 public cors 項目 listitem 一、Core WebAPI中的跨域處理 1.在使用WebAPI項目的時候基本上都會用到跨域處理 2.Core WebAPI的項目中自帶了跨域Cors的處理,不需要單獨添加程序包 3.使用方

.net core webapi 部署windows server 2008 r2 筆記

tin 筆記 拷貝 網站 相關 google 註意 api sof WebAPI部署文檔 安裝dotnet-dev-win-x64.1.0.4 安裝DotNetCore.1.1.0-WindowsHosting 安裝vc_redist.x64 安裝Windows6.1-K

asp.net core webapi 似乎未安裝在 IIS 中承載 .NET Core 項目所需的 AspNetCoreModule。請嘗試修復 Visual Studio 以糾正該問題。

pre tin nbsp img 承載 win res windows visual 安裝 DotNetCore.1.1.0-WindowsHosting 後,提示如題錯誤。 解決辦法: ASP.NET Core 應用程序運行,可以選擇 IIS Express 也可以選擇

LINUX 下Jexus部署ASP.NET Core WebApi

usr netcore stat /tmp tools onf 節點 提示符 微軟 服務器:LINUX ubuntu16.04 開發軟件:VS2015 Update3 dotnet sdk: DotNetCore.1.0.0-VS2015Tools.Previe

Global exception handling in asp.net core webapi

div 程序 todo color 返回 lob 文章 value config 在.NET Core中MVC和WebAPI已經組合在一起,都繼承了Controller,但是在處理錯誤時,就很不一樣,MVC返回錯誤頁面給瀏覽器,WebAPI返回Json或XML,而不是HTM

.NET Core webapi 發布到IIS配置文件

1.0 節點 -s sys 文件 type iis core eba 1.下載安裝文件 DotNetCore.1.0.0-WindowsHosting.exe dotnet-sdk-2.1.101-win-x64.exe 2.檢查IIS是否包含AspNetCoreMod

.Net Core 學習之路-AutoFac的使用

pos control typeof imp int doc 一個 級別 host 本文不介紹IoC和DI的概念,如果你對Ioc之前沒有了解的話,建議先去搜索一下相關的資料 這篇文章將簡單介紹一下AutoFac的基本使用以及在asp .net core中的應用 Autofa

發布 .Net Core WebAPI 應用程序到 Docker

ast esc 現在 netcore tree tps 冒號 copy host 目錄 1. 創建 .net core webapi 項目 2. 編譯應用 3. 創建 Dockerfile 文件 4. 上傳文件到服務器 5. 生成Docker Image 6. 在Dock

asp.net core webapi 使用ef 對mysql進行增刪改查,並生成Docker鏡像構建容器運行

rri put void userdata pro ext 代理 cte 成功 1.構建運行mysql容器,添加數據庫user 參考Docker創建運行多個mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html

Cordova Upload Images using File Transfer Plugin and .Net core WebAPI

ini blank see art back sele pad indexof apps In this article, I am going to explain ,"How to Upload Images to the server using Cordova Fi

用Macbook開發桌面應用,使用Alamofire鏈接.Net Core Webapi的註意事項!

結果 放棄 ads http 代碼 content ipaddress span rec ------------https方式----------------------- 因為Swift9之後訪問接口只能使用https,所以在後臺加入pfx文件(怎麽生成,自行百度吧)1