Agenda
- 前言
- DefaultControllerActivator
- BuildManagerViewEngine
- FilterProviderCollection
- Autofac對於MVC擴充解析器AutofacDependencyResolver
- 小結:
前言
前一篇介紹Asp.net MVC
可透過DependencyResolver.SetResolver
替換成IOC
容器注入控制器物件.
要建立客製化的解析器可以實現IDependencyResolver
介面並使用DependencyResolver.SetResolver
替換DefaultDependencyResolver
預設解析器
DependencyResolver
,Controller
和ControllerFactory
的關係如下圖
本篇介紹DependencyResolver
在Asp.net MVC
中有哪些實際的應用.
我有做一個可以針對於Asp.net MVC Debugger的專案,只要下中斷點就可輕易進入Asp.net MVC原始碼.
DefaultControllerActivator
在DefaultControllerFactory
建構子建立DefaultControllerActivator
,而DefaultControllerActivator
有一個Create
方法使用他來建立Controller
物件.
1 | internal DefaultControllerFactory(IControllerActivator controllerActivator, IResolver<IControllerActivator> activatorResolver, IDependencyResolver dependencyResolver) |
如果我們沒透過DependencyResolver.SetResolver
方法設定其他解析器,預設使用DefaultControllerActivator
類別幫助我們建立Controller
物件透過Create
方法.
1 | private class DefaultControllerActivator : IControllerActivator |
因為DependencyResolver.Current
建構子傳入參數IDependencyResolver resolver
一般是NULL
,所以會使用DependencyResolver.Current
解析器.
Create
方法預設利用DefaultDependencyResolver.GetService
創建物件(使用Activator.CreateInstance()
)
BuildManagerViewEngine
BuildManagerViewEngine
類別的詳細介紹會在之後的View
如何產生有更細節的資訊.
這邊是提一下哪邊有用到IDependencyResolver
解析器.
1 | internal class DefaultViewPageActivator : IViewPageActivator |
一樣可以看到有一個Create
方法.透過跟DefaultControllerActivator
一樣的操作來使用IDependencyResolver
解析器
預設使用DependencyResolver.Current
FilterProviderCollection
可以透過IOC
容器注入客製化ProvideFilter
使用行為.
預設ProvideFilter
有三個(詳細資訊會在之後分享)
GlobalFilterCollection
(在Global擴充)ControllerInstanceFilterProvider
(Controller
自行Override
)FilterAttributeFilterProvider
(提供Attribute
註冊最常用)
MVC Filters With Dependency Injection文章有介紹如何使用
1 | internal IFilterProvider[] CombinedItems |
Autofac對於MVC擴充解析器AutofacDependencyResolver
上面有說如果要改變MVC使用解析器可以透過DependencyResolver.SetResolver
方法傳入一個IDependencyResolver
物件,Autofac對於使的是AutofacDependencyResolver 原始碼.
替換完成後MVC就會使用AutofacDependencyResolver.GetService
取得物件.
這裡就不多敘述Autofac內部完成細節.
1 | public class AutofacDependencyResolver : IDependencyResolver |
小結:
本篇挑了幾個有使用到DependencyResolver
的使用點
在DefaultControllerActivator
建立Controller會利用當前使用的解析器來幫我們達成(預設DefaultDependencyResolver
)
如果我們不想要使用預設解析器也可自行替換自己的解析器(像Autofac第三方容器)來控制我們自己如何產生物件.
能看到Asp.net MVC
在設計上運用許多小巧思可讓系統可以更好的擴充且不用到到原本的程式碼
這些設計技巧很值得我們還學習效法.
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/ithelp-day14/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!