下面是https://source.dot.net/#Microsoft.AspNetCore.Mvc.Core/Controllers/ControllerActivatorProvider.cs的原始碼, 64ControllerActivatorProvider
public Func<ControllerContext, object> CreateActivator(ControllerActionDescriptor descriptor)
{
var controllerType = descriptor.ControllerTypeInfo?.AsType();
// ...
var typeActivator = ActivatorUtilities.CreateFactory(controllerType, Type.EmptyTypes);
return controllerContext => typeActivator(controllerContext.HttpContext.RequestServices, arguments: null);
}
我不明白為什么typeActivator是由 ActivatorUtilities.CreateFactory(controllerType, Type.EmptyTypes)where Type.EmptyTypesis創建的Array.Empty<Type>(),但是當我們創建控制器時,我們幾乎會定義一個建構式,該建構式接受將由 DI 決議的引數,例如HomeController:
public class HomeController: Controller
{
IUserRepository userRepo;
public HomeController(IUserRepository userRepo)
{
userRepo = this.userRepo;
}
}
那么為什么源代碼使用Type.EmptyTypes,如果控制器型別不接收引數,它如何作業?
uj5u.com熱心網友回復:
請注意,第一個引數是服務提供者:
typeActivator(controllerContext.HttpContext.RequestServices, arguments: null);
并注意它在檔案中所說的
將使用 System.IServiceProvider 和引數陣列實體化 instanceType 的工廠,該陣列包含與引數型別中定義的型別匹配的物件
所以第二個只用于直接提供的型別。其余的都是從服務提供商那里獲得的。在這種情況下,沒有直接提供。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518144.html
