dependency injection Interface

пытаюсь зарегистрировать IProcedure в program.cs но так не получается:

public interface IProcedure
{

}

public class Procedure : IProcedure 
{
     private IProcedure pro;
     public Procedure(IProcedure proced)
     {
          pro = proced
     }

}

        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();

            var collection = new ServiceCollection();
            collection.AddScoped<IProcedure, Procedure>();
            IServiceProvider serviceProvider = collection.BuildServiceProvider();

            if (serviceProvider is IDisposable)
            {
                ((IDisposable)serviceProvider).Dispose();
            }

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
            .UseWindowsService()
               .ConfigureLogging((ctx, logging) =>
               {
                   logging.AddConfiguration(ctx.Configuration);
                   logging.AddConsole();
               })
               .UseNLog()
               .ConfigureServices((hostContext, services) =>
               {
                   services.AddProducer(hostContext.Configuration, "rabbitMq:Configuration");
                   services.AddHostedService<Worker>();
               });

Пишет такую ошибку System.InvalidOperationException: 'Unable to resolve service for type 'Worker.Repository.IProcedure' while attempting to activate 'Worker.Worker'.'

Что я делаю не так ?


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

Автор решения: Нетерпеливый игуан

В данном случае нужно зарегистрировать сервис в методе ConfigureServices:

.ConfigureServices((hostContext, services) =>
           {
               services.AddScoped<IProcedure, Procedure>();
               services.AddProducer(hostContext.Configuration, "rabbitMq:Configuration");
               services.AddHostedService<Worker>();
           });

Обратите внимание на то, что вы создаете IServiceProvider в переменной serviceProvider и тут же его уничтожаете. Работа бесполезная. Этот код можно удалить, он не влияет на работу приложения

var collection = new ServiceCollection();
        collection.AddScoped<IProcedure, Procedure>();
        IServiceProvider serviceProvider = collection.BuildServiceProvider();

        if (serviceProvider is IDisposable)
        {
            ((IDisposable)serviceProvider).Dispose();
        }
→ Ссылка