如何将服务注入到 ASP.NET Core 7 中的工厂函数(ModelBuilderFactory)中

问题描述 投票:0回答:1

在我们的应用程序设置中配置工厂功能时,我很难访问服务。

我们正在使用 Asp.Versioning,我正在尝试注入一个服务以在我们的自定义模型构建器中使用。

这里是相关配置部分

builder.Services.AddSingleton(Of EdmTypeReplacer)
builder.Services.AddApiVersioning() _
    .AddMvc() _
    .AddOData(Sub(o)
        o.ModelBuilder.OnModelCreated = Sub(modelBuilder, model)
                ' I want to use my injected EdmTypeReplacer here.
                ' Not a static class instance (which I'm using currently)
                Dim replacer = EdmTypeReplacer.Instance
                replacer.OnModelCreated(model)
            End Sub
        o.ModelBuilder.ModelBuilderFactory = Function()
                ' I want to use my injected EdmTypeReplacer here.
                ' Not a static class instance (which I'm using currently)
                Dim replacer = EdmTypeReplacer.Instance
                Return New CustomConventionODataModelBuilder(replacer)
            End Function
        End Sub) _
    .AddODataApiExplorer()

我正在尝试将单例

EdmTypeReplacer
注入到
CustomConventionODataModelBuilder
中,但我无法将服务传递给
ModelBuilderFactory
Function
参数,因为它需要一个空函数委托。

我也需要在

EdmTypeReplacer
的委托中访问
OnModelCreated
的同一实例。

我不确定如何/是否可以访问

ServiceProvider
,因为它仍在构建中。

我目前被迫创建

EdmTypeReplacer
作为静态类单例实例并使用它,但我确信必须有一种方法来注入它,或者至少访问工厂函数中的
ServiceProvider

如果您更熟悉的话,请随意用 C# 而不是 VB 给出任何答案。

vb.net asp.net-core dependency-injection
1个回答
0
投票

根据您的描述,您似乎想在构建过程中将 EdmTypeReplacer 注入 OnModelCreated 方法中,我建议您可以创建一个工厂方法,通过使用 BuildServiceProvider 在运行时解析服务,然后使用 GetRequiredService 来获取服务。

由于我对VB不熟悉,我可以提供C#示例。

builder.Services.AddSingleton<EdmTypeReplacer>();

builder.Services.AddApiVersioning()
    .AddMvc()
    .AddOData(o =>
    {
        o.ModelBuilder.OnModelCreated = (modelBuilder, model) =>
        {
            var serviceProvider = builder.Services.BuildServiceProvider();
            var replacer = serviceProvider.GetRequiredService<EdmTypeReplacer>();
            replacer.OnModelCreated(model);
        };

        o.ModelBuilder.ModelBuilderFactory = () =>
        {
            var serviceProvider = builder.Services.BuildServiceProvider();
            var replacer = serviceProvider.GetRequiredService<EdmTypeReplacer>();
            return new CustomConventionODataModelBuilder(replacer);
        };
    })
    .AddODataApiExplorer();
© www.soinside.com 2019 - 2024. All rights reserved.