在Delphi的Spring4D中,如何为依赖ICoffeeMaker的TKitchen配置实例?
在Spring4D容器中为IKitchen指定ICoffeeMaker的实现与实例配置
根据Spring4D的依赖注入机制,你可以通过以下几种方式控制Resolve<IKitchen>()时注入的ICoffeeMaker实现及实例配置:
1. 直接绑定ICoffeeMaker到目标实现类
如果只需使用固定的TCoffeeMaker实现,直接注册接口与类的绑定即可,容器会自动处理注入逻辑:
// 先注册ICoffeeMaker的实现 Container.RegisterType<ICoffeeMaker, TCoffeeMaker>(); // 注册IKitchen(已注册的话可跳过) Container.RegisterType<IKitchen, TKitchen>(); // 此时Resolve<IKitchen>()会自动注入TCoffeeMaker的实例 var Kitchen := Container.Resolve<IKitchen>();
默认情况下,每次Resolve都会创建新的TCoffeeMaker实例(Transient生命周期),如果需要单例,可追加.AsSingleton():
Container.RegisterType<ICoffeeMaker, TCoffeeMaker>.AsSingleton();
2. 通过工厂函数自定义实例创建与配置
如果需要对ICoffeeMaker实例做初始化配置(比如设置属性、传入构造参数),可以用工厂委托注册:
Container.RegisterType<ICoffeeMaker>.DelegateTo( function: ICoffeeMaker var CoffeeMaker: TCoffeeMaker; begin // 自定义实例创建逻辑 CoffeeMaker := TCoffeeMaker.Create(/* 传入构造参数 */); // 配置实例属性 CoffeeMaker.BrewDuration := 3000; CoffeeMaker.SetBeanType('Arabica'); Result := CoffeeMaker; end ); // 注册IKitchen后,Resolve时会使用工厂生成的配置好的实例 Container.RegisterType<IKitchen, TKitchen>();
3. 多实现场景下的精准选择(命名注册)
如果存在多个ICoffeeMaker的实现(比如TCoffeeMaker和TEspressoMaker),可以通过命名注册来指定注入哪一个:
// 注册多个命名实现 Container.RegisterType<ICoffeeMaker, TCoffeeMaker>('Regular'); Container.RegisterType<ICoffeeMaker, TEspressoMaker>('Espresso'); // 方式1:注册IKitchen时指定注入的命名实例 Container.RegisterType<IKitchen, TKitchen>.InjectConstructor( Container.Resolve<ICoffeeMaker>('Espresso') ); // 方式2:用工厂函数动态选择 Container.RegisterType<IKitchen, TKitchen>.DelegateTo( function: IKitchen begin // 根据逻辑选择对应实现,这里示例选Regular Result := TKitchen.Create(Container.Resolve<ICoffeeMaker>('Regular')); end );
4. 配置单例实例的属性
如果ICoffeeMaker注册为单例,你可以在注册后直接获取实例并配置,后续注入的都是这个已配置好的实例:
Container.RegisterType<ICoffeeMaker, TCoffeeMaker>.AsSingleton(); // 获取单例实例并配置 (Container.Resolve<ICoffeeMaker> as TCoffeeMaker).BrewDuration := 2500; // 此时Resolve<IKitchen>()注入的就是这个配置完成的单例 var Kitchen := Container.Resolve<IKitchen>();
注意:所有依赖的注册操作需要在Resolve之前完成,确保容器能正确解析依赖链。
内容的提问来源于stack exchange,提问作者NSliM
相关产品推荐
相关产品推荐

