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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:01:43