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
相关产品推荐
相关产品推荐

