You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 7中如何向ModelBuilderFactory工厂函数注入服务?

解决Asp.Versioning OData配置中无法注入服务到模型构建器的问题

核心思路是利用单例服务的特性,在配置阶段临时构建服务提供者获取已注册的EdmTypeReplacer实例,既满足ModelBuilderFactory无参委托的要求,又保证CustomConventionODataModelBuilder和OnModelCreated回调使用同一个单例实例。

实现步骤

  1. 将EdmTypeReplacer注册为单例服务
  2. 临时构建服务提供者(关闭作用域验证,避免配置阶段警告),获取EdmTypeReplacer的单例实例
  3. 在OData配置中直接使用该实例完成模型构建器初始化与回调逻辑

C# 代码实现

// 1. 注册EdmTypeReplacer为单例服务
builder.Services.AddSingleton<EdmTypeReplacer>();

// 2. 临时构建服务提供者,获取单例实例(关闭作用域验证避免配置阶段警告)
var tempServiceProvider = builder.Services.BuildServiceProvider(validateScopes: false);
var edmTypeReplacer = tempServiceProvider.GetRequiredService<EdmTypeReplacer>();

// 3. 配置ApiVersioning与OData
builder.Services.AddApiVersioning()
    .AddMvc()
    .AddOData(o =>
    {
        o.ModelBuilder.OnModelCreated = (modelBuilder, model) =>
        {
            // 使用注入的单例实例执行逻辑
            edmTypeReplacer.OnModelCreated(model);
        };

        o.ModelBuilder.ModelBuilderFactory = () =>
        {
            // 传入同一单例实例初始化自定义模型构建器
            return new CustomConventionODataModelBuilder(edmTypeReplacer);
        };
    })
    .AddODataApiExplorer();

说明

  • 由于EdmTypeReplacer是单例服务,临时构建的tempServiceProvider获取的实例与最终应用运行时使用的实例完全一致,确保CustomConventionODataModelBuilder的配置变更能在OnModelCreated回调中生效。
  • validateScopes: false参数是必要的,因为配置阶段未完全建立作用域规则,关闭验证可避免不必要的警告。

内容的提问来源于stack exchange,提问作者Daniel Vernall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:16:00