ASP.NET Core 7中如何向ModelBuilderFactory工厂函数注入服务?
解决Asp.Versioning OData配置中无法注入服务到模型构建器的问题
核心思路是利用单例服务的特性,在配置阶段临时构建服务提供者获取已注册的EdmTypeReplacer实例,既满足ModelBuilderFactory无参委托的要求,又保证CustomConventionODataModelBuilder和OnModelCreated回调使用同一个单例实例。
实现步骤
- 将
EdmTypeReplacer注册为单例服务 - 临时构建服务提供者(关闭作用域验证,避免配置阶段警告),获取
EdmTypeReplacer的单例实例 - 在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
相关产品推荐
相关产品推荐

