我创建了一个示例来测试我对.NET Core上依赖项解析(特别是它们的顺序,如果有的话)的理解。
它确实澄清了一些问题,但给我留下了一个没有答案的问题。
请考虑以下辅助服务模板代码:
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
{
}
求爱
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);
}
}
}
程序.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...
只有
我希望
Instance of [Woo] being created...
也打印,因为它是的依赖项
Goo
,已解决。
我希望
Woo
也是必需的解析,因此调用它的构造函数。但这种情况只发生在
古
,不适用
求爱
。
为什么?