gpt4 book ai didi

c# - 当Action 的参数类型时实例化对象的对象

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:09 25 4
gpt4 key购买 nike

我正在查看github上的.net core 2.0代码,以使文章中的某些代码不混淆,并遇到this

public static IMvcBuilder AddRazorPagesOptions(
this IMvcBuilder builder,
Action<RazorPagesOptions> setupAction)
{ }


经审查,似乎没有显式实例化 RazorPagesOptions类型的对象。我当时的问题是,如何实例化 RazorPageOptions类型的对象?

最佳答案

这与ASP.NET Core依赖项注入模式的实现有关。 Daisy在评论中指出的内容完全表明:

builder.Services.Configure(setupAction)


builderIMvcBuilderbuilder.ServicesIServiceCollection,也就是说,设置为asp-net应用程序中可用的所有服务的主列表。在Startup.cs中设置了FoobarService?然后,IFoobarService的定义可能位于ServiceCollection中。等等。

ServiceCollection附带了许多扩展方法,这些扩展方法使添加新服务更加容易。它还具有 .BuildServiceProvider(),它采用所有已注册的定义并创建服务工厂/提供者/缓存/解析器/您/ asp以后可用来获取这些服务的实际实例的内容。

然后,除了服务注册和建立工厂之外,由于“每个人都习惯”在ServiceCollection引起人们关注的Startup.cs中进行设置,因此还有一种习惯来配置服务可能需要的更多详细信息可以通过ServiceCollection或姊妹对象上的更多扩展方法在Startup.cs中访问。

现在,ASP.NET Core MVC具有用于处理应用程序配置的模块。它的设计是这样的,您可以定义一个类(通常称为WhateverOptions),该类将包含与Whatever相关的配置的某些部分,以后可以由任何服务通过仅要求将其注入来检索。但是,由于我们将配置拆分为许多或多或少的上下文对象,因此,如果要全部实例化(在一个地方?)并填充它们(在一个地方?!),将是一团糟。为了方便起见,所有这些都将由框架创建。剩下的问题是,谁来填充他们的实际设置。

..这与您所发现的相近。该行:

builder.Services.Configure(setupAction)


采取Action(具有1个参数的函子:Razor-Options)并将其注册到任何服务上的“大信息包”中。它被注册为RazorPagesOptions的设置源。作为副作用,IoC容器还了解到某些服务可能需要 RazorPagesOptions这个东西。

稍后,在运行时期间,当有人请求服务实例时,如果该服务需要 RazorPagesOptions,则容器会检查它是否已经准备好。如果不是,那么将创建这些 RazorPagesOptions的实例(可能在单例模式下),但是当然它最初是空的。然后,它通过所有注册的设置源。每个这样的源依次被调用,每个源都获得该RazorPagesOptions实例,并且每个人都有机会用其设置的一部分来填充它。最后,当所有文件都运行后,RazorPagesOptions的实例(可能已缓存,然后将..)传递给需要它的服务。

我还没有说的一件事是 Action<RazorPagesOptions>实例从何而来。它可能来自Startup.cs。那里的某处类似以下内容:

services
.AddMvc() // registers MVC services in IoCC and gets you the IMvcBuilder
.AddRazorPagesOptions(options =>
{
options.RootDirectory = "....";
options.Conventions.Add(new FooConvention....);
...
});


options => {..}Action<RazorPagesOptions>,将传递给AddRazorPagesOptions,然后传递给 serviceCollection.Configure,并将其注册为RazorPagesOptions的实际设置源。

外卖:


假设您编写了一个ASP.NET Core MVC应用程序,那么它在Startup.cs中的代码就创建了Action <>委托的实例-或者当您在调用AddRazorPagesOptions方法时编写一个lambda时实际上是“编译器完成了”
(可能)不立即调用此委托,但将其存储以备后用
在应用程序运行时生存期的某个时候,ASP.NET Core MVC框架会注意到需要RazorPagesOptions并将创建实例。可能通过Reflection或Activator.CreateInstance(Type),所以您在任何地方都找不到 new RazorPagesOptions()
所有这些都特定于ASP.NET Core MVC,而不是纯C#
其他库/框架/ IoCC /等中也存在类似的机制和模式
和最后的注释-我试图以“易于理解的方式”编写它,而不是100%精确。我在这里写的很多东西“有点不正确”,但是恕我直言,足够接近

关于c# - 当Action <SomeObject>的参数类型时实例化对象的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49845359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com