【发布时间】:2018-10-12 20:32:26
【问题描述】:
我的意图只是使用通用主机在控制台应用程序中从另一个微服务调用一个微服务。
它在运行时失败并出现以下异常。我已经阅读了数十篇与 WebHostBuilder 相关的帖子,但无法将这些讨论与我试图用 HostBuilder 做的事情联系起来。我显然缺少一些基本的东西,并且非常感谢指导。下面是一个人为的代码示例。附言我相信我已经完成了适当的格式化和标记工作,以安抚那些真正知道自己在做什么的人 - 显然我不知道!
例外
System.InvalidOperationException: '在尝试激活 'MyNoobProject.DoSomethingWithToDo' 时,无法解析类型 'MyNoobProject.IToDo' 的服务。'
程序.cs
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
public static async Task Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<IHostedService, ToDo>();
services.AddSingleton<IHostedService, DoSomethingWithToDo>();
})
.ConfigureLogging((hostingContext, logging) => {
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
});;
await builder.RunConsoleAsync();
}
StackOverflow.cs
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
namespace MyNoobProject
{
interface IToDo
{
Task Add(int i);
void Dispose();
}
class ToDo : IHostedService, IDisposable, IToDo
{
private BlockingCollection<int> _blockingCollection;
private readonly ILogger _logger;
public ToDo(ILogger<ToDo>logger)
{
_logger = logger;
}
public Task Add(int i)
{
_blockingCollection.Add(i);
return Task.CompletedTask;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_blockingCollection = new BlockingCollection<int>();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
_blockingCollection.CompleteAdding();
return Task.CompletedTask;
}
public void Dispose()
{
_blockingCollection.Dispose();
}
}
interface IDoSomethingWithToDo
{
}
class DoSomethingWithToDo : IHostedService, IDisposable, IDoSomethingWithToDo
{
private IToDo _todo;
public DoSomethingWithToDo(IToDo todo)
{
_todo = todo;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_todo.Add(1);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public void Dispose()
{
}
}
}
【问题讨论】:
-
您需要注册
IToDo。 -
@Daniel A. White 您能否在我的代码示例的上下文中为我拼写出来?谢谢。
-
将
ILogger更改为ILogger<ToDo>。 -
@Kirk Larkin 问题已正式编辑。
标签: c# dependency-injection .net-core-2.1