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();
}