代码之家  ›  专栏  ›  技术社区  ›  Veverke

.NET核心中的依赖项解析

  •  1
  • Veverke  · 技术社区  · 3 年前

    我创建了一个示例来测试我对.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 也是必需的解析,因此调用它的构造函数。但这种情况只发生在 ,不适用 求爱

    为什么?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Guru Stron    3 年前

    因为内置DI不支持属性注入,所以 Woo 没有任何问题需要解决:

    public class Woo : IWoo
    {
        IFoo Foo;
        public void WooM1(IFoo foo)
        {
            Foo = foo;
            Console.WriteLine($"Instance of [{this.GetType().Name}] being created...");
        }
    }
    

    来自 docs 以下为:

    内置服务容器旨在满足框架和大多数消费者应用程序的需求。我们建议使用内置容器,除非您需要它不支持的特定功能,例如:

    • 房地产注入
    • 。。。

    如果添加ctor:

    IFoo Foo;
    
    public Woo(IFoo foo)
    {
        Foo = foo;
    }
    

    然后,您将获得预期的循环依赖关系异常:

    生存期:Singleton ImplementationType:TestWorker.Worker:检测到类型为“TestWorker.IGoo”的服务存在循环依赖关系。