在我们的应用程序设置中配置工厂功能时,我很难访问服务。
我们正在使用 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 给出任何答案。
根据您的描述,您似乎想在构建过程中将 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();