You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dry IoC中带自注册机制的组件注册解析及RegisterInitializer原理疑问

问题描述
  • 现有外部库提供的IFoo服务自带组件注册机制,其NuGet包的AddFooServices方法可将该服务及依赖注册到IServiceCollection。但我们需要在ModuleA的Register方法中向Dry IoC容器注册IFoo,此时IServiceCollection尚未创建。
  • 尝试使用RegisterInitializer<IFoo>方案会导致首次请求性能开销,希望能在注册阶段完成服务初始化。
  • 另外,当IFoo和依赖它的Bar均为单例时,依赖IFoo的多个服务实例访问它时,RegisterInitializer的委托调用次数与文档描述不符,实际仅调用一次,需确认其原理。

相关代码

IFoo接口定义

public interface IFoo
{  
    public void RegisterSomething<T>();
  
    public void Start();
}

Program类

public static class Program  
{  
    private static IHostBuilder CreateHostBuilder(string[] args) =>  
        Host.CreateDefaultBuilder(args)  
            .UseDryIoc(  
                ModuleA.Register,  
                ModuleB.Register)  
            .ConfigureWebHostDefaults(web =>  
            {  
                web.UseStartup<Startup>()  
                   .UseIIS();  
            });  
  
    public static void Main(string[] args)
        => CreateHostBuilder(args)
            .Build()
            .Run();
}

ModuleA类

public static class ModuleA  
{  
    public static IServiceCollection AddServices(this IServiceCollection services)  
    {  
        services.AddFooServices();  
  
        return services;  
    }  
  
    public static void Register(IContainer container)  
    {  
        container.Register<Bar>(Reuse.Singleton);  
  
        container.RegisterInitializer<IFoo>((service, resolver) =>  
            resolver.Resolve<Bar>());  
    }  
  
    internal class Bar  
    {  
        public IFoo Service { get; init; } = null!;  
  
        public Bar()  
        {  
            Service.RegisterSomething<Something>();  
  
            Service.Start();  
        }  
    }  
}

内容的提问来源于stack exchange,提问作者Maksim Lavrentev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:22:35