iT邦幫忙

2022 iThome 鐵人賽

DAY 26
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 26

[Dot Net Core](常用套件) 26.套件Autofac於專案中如何快速擴充客製註冊方法

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220926/20144614SfK5HPKLzU.jpg

之前討論了 Autofac套件內部是如何運作的,稍微了解整個流程,雖然不是百分百都將所有細節都展現出來,但也可以了解近七、八成的主要執行方式。

這篇是探討,利用這個套件後,欲加上自己的註冊方式,或者遇到沒有支援的情境時要擴充一個註冊函示,要如何下手。

其實觀察套件供註冊的方式,與其它貢獻者貢獻出來的新的註冊函示,都是利用了C#的 Extension Method 的特性。這篇也僅僅是利用了此一特性,做了一個擴充的簡單範例。如果熟悉上一篇的內容,可以設計出獨特的註冊情境,利用它的 Container ComponentRegistry 、 RegistrationBuilder、 ComponentRegistration 等內容來操作。

此篇利用改寫的方式做一個釋例,將原本難以理解的 RegisterDecorator 做一個改寫,使之更簡便易讀操作。進而了解體驗如何做擴充。

首先來看套件提供的 RegisterDecorator 如何使用。裝飾者模式是我們很常運用的一套模式,是一種擴充物件的好方法。

想像一下要處理:

new DecoratorSuperSessionInjectionClass( new DecoratorSessionInjectionClass( new DecoratorInjectionClass(…) ) )

DecoratorInjectionClass 被 DecoratorSessionInjectionClass 裝飾,然後 DecoratorSessionInjectionClass 又被DecoratorSuperSessionInjectionClass裝飾。

一層又一層的裝飾,是不是有點複雜與易寫錯,如少一個括號等,某種程度上不太好讀與花費時間在偵錯。如果可以DI注入的方式解決,是非常棒的。

於是Autofac提供了一個註冊方式(RegisterDecorator) 解決了此問題。

https://ithelp.ithome.com.tw/upload/images/20220926/201446140poImYbJiY.jpg

如此可以實現使用類別 DecoratorSuperSessionInjectionClass 產生的實例,且確實包裝了對應的類別。但是這種註冊方式有點難理解,每裝飾一層要寫一次…..令人有點頭痛。

於是,我們可以客製改寫一個較清楚的註冊,來達成一樣的作用,且程式碼某種程度較好理解一些。

將新增一個擴充函式 :

https://ithelp.ithome.com.tw/upload/images/20220926/20144614zdNVq29tE3.jpg

傳入一個 List<DecoratorSeal<>>的裝飾目標集合,可以用泛型帶入要註冊的類別。而這個 DecoratorSeal 類別為裝飾目標的資訊,定義如下:

https://ithelp.ithome.com.tw/upload/images/20220926/20144614P6ZmUWtmBt.jpg

於是我們可以註冊此一擴充的裝飾者:

https://ithelp.ithome.com.tw/upload/images/20220926/20144614jZZuCxZWvk.jpg

執行好註冊後,於程式主體就可以resolve出實體:

https://ithelp.ithome.com.tw/upload/images/20220926/20144614q538IdA1f9.jpg

改成較易讀的方式,也只是改變傳入的方式,但利用VS的開發工具更快的原因是僅僅餵入參數該給的值,就達成註冊的效果。


上一篇
[Dot Net Core](圖解系列) 25. 優秀套件之運作 - Autofac 運作圖解
下一篇
[Dot Net Core](常用套件) 27. 批次註冊至 IOC Container - Scrutor vs Autofac
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言