NEST & Dependency Injection

Возник вопрос, а как грамотно добавить в DI ElasticClient?

Как вариант:

services.AddSingleton<ElasticClient>();

Но в данном случае ElasticClient остается несконфигурированным и, по своей сути, бесполезный.

Второй вариант, который мне пришел в голову - написать класс обертку

public class ElasticContext {
     public ElasticClient Client;
     public ElasticContext () {
           Client = new ElasticClient(new AbstractSettings());
     }
}

И потом:

services.AddSingleton<ElasticContext>();

Но, тогда приходится обращаться к свойству Client, что выглядит костыльно.
Слаб в DI, подскажите пожалуйста как можно сделать красиво.


Ответы (1 шт):

Автор решения: icYFTL

@tym32167, спасибо тебе.

public static class ElasticsearchExtensions
    {
        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))
                .DefaultMappingFor<Post>(m => m
                    .Ignore(p => p.IsPublished)
                    .PropertyName(p => p.ID, "id")
                )
                .DefaultMappingFor<Comment>(m => m
                    .Ignore(c => c.Email)
                    .Ignore(c => c.IsAdmin)
                    .PropertyName(c => c.ID, "id")
                );

            var client = new ElasticClient(settings);

            services.AddSingleton<IElasticClient>(client);
        }
    }
→ Ссылка