.NET 6 ASP.NET应用调用AddElasticsearch扩展报编译错误如何解决
错误原因
你定义的AddElasticsearch扩展方法的第二个入参要求直接传入IConfiguration实例,但你调用时传入了lambda表达式,类型不匹配才触发编译报错。
修正方法
直接修改Program.cs里的调用代码,把lambda替换成builder.Configuration即可:
var builder = WebApplication.CreateBuilder(args); builder.Services // 直接传入Configuration实例,不要用lambda .AddElasticsearch(builder.Configuration) .AddGraphQLServer() .AddQueryType<Query>(); var app = builder.Build(); app.MapGraphQL(); app.Run();
可选优化(支持lambda配置风格)
如果你想要保留options => { }的配置写法,可以调整扩展方法的定义,改成支持选项委托的形式:
public static class Extensions { // 新增支持选项委托的重载 public static void AddElasticsearch(this IServiceCollection services, Action<ElasticsearchOptions> configureOptions) { var options = new ElasticsearchOptions(); configureOptions(options); var settings = new ConnectionSettings(new Uri(options.Url)).DefaultIndex(options.DefaultIndex); AddDefaultMappings(settings); var client = new ElasticClient(settings); services.AddSingleton(client); CreateIndex<LegiscanModelBill>(client, options.DefaultIndex); } // 原有接收IConfiguration的重载也可以保留 public static void AddElasticsearch(this IServiceCollection services, IConfiguration configuration) { var url = configuration["elasticsearch:url"]; var defaultIndex = configuration["elasticsearch:index"]; var settings = new ConnectionSettings(new Uri(url)).DefaultIndex(defaultIndex); AddDefaultMappings(settings); var client = new ElasticClient(settings); services.AddSingleton(client); CreateIndex<LegiscanModelBill>(client, defaultIndex); } private static void AddDefaultMappings(ConnectionSettings settings) => settings.DefaultMappingFor<LegiscanModelBill>(m => m); private static void CreateIndex<T>(ElasticClient client, string indexName) where T : class { // 建议把ToString()换成Name,避免索引名带上类的完整命名空间 client.Indices.Create($"{indexName}_{typeof(T).Name}", i => i.Map<T>(m => m.AutoMap())); } } // 新增选项类 public class ElasticsearchOptions { public string Url { get; set; } public string DefaultIndex { get; set; } }
调整后你就可以用lambda写法传入配置了:
builder.Services.AddElasticsearch(options => { options.Url = builder.Configuration["elasticsearch:url"]; options.DefaultIndex = builder.Configuration["elasticsearch:index"]; });
内容的提问来源于stack exchange,提问作者Antarr Byrd
相关产品推荐
相关产品推荐

