我正在查看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)builder是IMvcBuilder。 builder.Services是IServiceCollection,也就是说,设置为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%精确。我在这里写的很多东西“有点不正确”,但是恕我直言,足够接近 10-07 14:13