我创建了一个示例来测试我对.NET Core上依赖解析的理解(特别是它们的顺序,如果有的话)。
这确实澄清了一些问题,但还有一个未解答的问题。
考虑以下工作服务模板代码:
Foo
好
Woo
工人服务
起初,我想确保在
然而,运行上述代码只会打印出
考虑到
我本应该期望
为什么会这样呢?
这确实澄清了一些问题,但还有一个未解答的问题。
考虑以下工作服务模板代码:
Foo
public class Foo : IFoo
{
private readonly IGoo Goo;
public Foo(IGoo goo)
{
Goo = goo;
Console.WriteLine($"Instance of [{this.GetType().Name}] being created...");
}
}
public interface IFoo { }
好
public class Goo : IGoo
{
private readonly IWoo Woo;
public Goo(IWoo woo)
{
Woo = woo;
Console.WriteLine($"Instance of [{this.GetType().Name}] being created...");
}
}
public interface IGoo { }
Woo
public class Woo : IWoo
{
IFoo Foo;
public Woo(IFoo foo)
{
Foo = foo;
Console.WriteLine($"Instance of [{this.GetType().Name}] being created...");
}
}
public interface IWoo { }
工人服务
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
//private readonly IFoo Foo;
private readonly IGoo Goo;
//private readonly IWoo Woo;
public Worker(ILogger<Worker> logger, /*IFoo foo,*/ IGoo goo/*, IWoo woo*/)
{
_logger = logger;
//Foo = foo;
Goo = goo;
//Woo = woo;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
services.AddSingleton<IFoo, Foo>();
services.AddSingleton<IGoo, Goo>();
services.AddSingleton<IWoo, Woo>();
});
}
起初,我想确保在
ConfigureServices
内部声明依赖关系的顺序并不重要。然而,运行上述代码只会打印出
Instance of [Goo] being created...
。考虑到
Goo
是Woo
的依赖项,并且已经解析出来,我本应该期望也会打印出Instance of [Woo] being created...
。我本应该期望
Woo
也需要被解析,并且调用它的构造函数。但是这只发生在Goo
上,而不是Woo
上。为什么会这样呢?