or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
在 APS.NET 使用 Autofac 實作 DI
Autofac
Autofac 是 ASP.NET 比較有名的 DI 套件,早期還有其他的套件,但後續因與 ASP.NET Core 相容問題,很多都淘汰掉了(雖然 ASP.NET Core 有内建 DI 工具,但因為功能相對較為陽春,所以很多人還是會裝其他套件來擴充使用)。 最初選擇 Autofac 的原因是因為它的型別註冊功能很強大,且官方文件也滿詳細的,又有提供多個框架的支援,結果剛好這套套件也順利活到 ASP.NET Core 時代。
Autofac 的使用方式如下面範例,其中如果是在 Web 使用時,Autofac 會幫忙在每個 Request 建立一個 Lifetime Scope。
Register Type
Autofac 註冊型別使用的 Method 為
RegisterType<{Instance Type}>().As({Declare Type})
,也就是說當 Autofac 遇到一個取得 Service Type 的請求時,會建立一個 Instance Type 的物件回傳。使用 Reflection 大量註冊型別
由於每個型別都要個別進行註冊過於繁雜,Autofac 有提供使用 Reflection 去搜尋 Assembly 底下的特定型別進行註冊,官網本身也提供一些範例可以參考。
自行設定 Instance 的建立方法
當 Class 裡有多個 Constructor 時,會找出全部能透過 Autofac 建立的 Constructor(意思是全部參數都能用 DI 設值),選擇參數最多的來使用,詳情參閱黑暗執行緒 - Autofac筆記4-建構參數與建構式選擇,但如果我們希望能自行決定物件建立方法,可以用以下程式碼設定。
指定註冊型別給哪些型別使用
如果未設定使用型別,預設使用
AsSelf()
,但如果有指定時,就不會自動增加AsSelf()
,可多項指定一起使用。Instance Scope
Autofac 提供以下 Instance Scope:
InstancePerMatchingLifetimeScope({Tag})
和InstancePerRequest()
皆為InstancePerLifetimeScope()
的變種。 當在呼叫container.BeginLifetimeScope({Tag})
建立 Scope 時,可以設定 Tag,而宣告InstancePerMatchingLifetimeScope({Tag})
的型別,只能建立在標記該 Tag 的 Scope 底下。 Autofac在 Web 的每個 Request 裡,都會建立一個 Tag 為 「AutofacWebRequest」 的 Scope,而InstancePerRequest()
大致等同於InstancePerMatchingLifetimeScope("AutofacWebRequest")
。官網文件
設定允許使用 Property Injection
PropertyWiringOptions.AllowCircularDependencies
。官網文件
在 MVC 上使用 Autofac
NuGet 套件
程式碼範例
Golbal.asax.cs
以下程式碼來自官網範例,
RegisterControllers()
為必要,要設定後,才可以將 Instance Injection 到 Controller。 註解被標註「OPTIONAL」視情況是否添加,例如要使用HttpContextBase
等型別注入,則需要 RegisterAutofacWebTypesModule
。HomeController
在 View 使用 DI
WebViewPageBase
Index.cshtml
設定 Index.cshtml 繼承 WebViewPageBase,此時有三種方法可以使用 IAppService:
GetDependencyService<IAppService>()
,其實等同於直接在 View 使用DependencyResolver.Current.GetService<TService>()
,只是在父類別簡化呼叫。就個人偏好,每個 View 都有機會用到的使用方法 2,個別 View 用到的使用方法 3。 如果沒使用方法 1,Global 就不需要設定
builder.RegisterSource(new ViewRegistrationSource())
。無使用 Model 寫法如下:
有使用 Model 寫法如下:
如果希望可以和原來一樣不使用 Model 就不用特別宣告,使用 Model 則使用
@model ViewModel
宣告的作法,請參考此篇文章修改\View\Web.config
內容。模擬 ASP.NET Core 的
FromServicesAttribute
Injection 至 Action ParameterServicesModelBinder
FromServicesAttribute
Controller Action
封裝 AppSettings 來作 Injection
一般取得 AppSettings 都是使用
WebConfigurationManager.AppSettings
來取得設定值,但直接使用它有兩個缺點:string
,如果有bool
或數值型別需求時,每次使用都要進行型別轉換,所以最好是可以在進一步進行封裝處理。WebConfigurationManager
是 Static Class,但有些情況下(e.g. 單元測試),會希望值能用參數的方式傳入,所以有些人會用 Singleton 進行封裝。以下程式碼是基於一個原則進行設定,如果有其他需求,可自行調整,AppSetting Key 必需為
{Options Class Name(不包含 Options)}:{Constructor Parameter Name}
,大小寫隨意,例如有一個 Options 名為TestOptions
,Constructor 參數名為isTest
,那 AppSetting Key 為Test:IsTest
Web.config
Golbal.asax.cs
OptionsModule
實際設定 Option DI 的地方
PathOptions
TestOptions
官網文件
MVC
在 Web API 上使用 Autofac
NuGet 套件
程式碼範例
Golbal.asax.cs
以下程式碼來自官網範例,
RegisterApiControllers()
為必要,要設定後,才可以將 Instance Injection 到 ApiController。 註解被標註「OPTIONAL」視情況是否添加。ValuesController
官網文件
Web API
在 Web Form 上使用 Autofac
由於 Web Form 不支援 Constructor Injection,所以需要用 Property Injection。
NuGet 套件
程式碼範例
Web.config
官網建議兩種寫法都寫,來相容不同的 IIS 版本,但實際上兩個都寫有可能會有 Error。
Golbal.asax.cs
Default.aspx.cs
官網文件
Web Forms
在 Web Service 上使用 Autofac
WebServiceBase
來實作這部分。NuGet 套件
程式碼範例
Golbal.asax.cs
同 Web Form。
WebServiceBase
WebService
tags:
.NET
.NET Framework
ASP.NET
Dependency Injection
Autofac