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

Simple Injector是否具备类似Autofac Factory Delegates的功能?

Simple Injector 自定义强类型工厂委托实现方案

Simple Injector 原生支持该场景,可实现和 Autofac 完全一致的使用体验,无需手动编写工厂包装类。

实现步骤

你之前定义的 Shareholding 类无需做任何修改,直接保留嵌套的 Factory 强类型委托即可:

public class Shareholding
{
    // 保留自定义强类型委托定义
    public delegate Shareholding Factory(string symbol, uint holding);

    public Shareholding(string symbol, uint holding, IQuoteService quoteService)
    {
        // 省略初始化逻辑
    }
}

注册逻辑

首先注册服务及其依赖,再注册对应的工厂委托即可:

// 注册依赖服务
container.Register<IQuoteService, DefaultQuoteService>();
// 注册目标服务
container.Register<Shareholding>();
// 注册自定义工厂委托
container.RegisterSingleton<Shareholding.Factory>(() => 
    (symbol, holding) => container.GetInstance<Shareholding>(
        new TypedParameter(typeof(string), symbol),
        new TypedParameter(typeof(uint), holding)
    )
);

如果需要批量处理多个服务的嵌套 Factory 委托,可以自己封装一个通用扩展方法,扫描程序集中所有包含嵌套 Factory 委托的服务,自动完成注册,无需逐个手动编写注册逻辑。

消费者使用方式

和你在 Autofac 中的用法完全一致,无需修改任何消费者代码:

public class Portfolio
{
    private readonly Shareholding.Factory _shareHoldingFactory;
    private readonly List<Shareholding> _holdings = new List<Shareholding>();

    public Portfolio(Shareholding.Factory shareholdingFactory)
    {
        _shareHoldingFactory = shareholdingFactory;
    }

    public void Add(string symbol, uint holding)
    {
        // 调用工厂自动补全IQuoteService依赖,返回新的Shareholding实例
        _holdings.Add(_shareHoldingFactory(symbol, holding));
    }
}

疑问解答

  • 关于自定义强类型委托而非通用Func的需求:上述方案直接注册你定义的 Shareholding.Factory 类型,消费者直接依赖该强类型委托即可,后续修改工厂参数仅需要修改委托定义和对应注册逻辑,无需修改所有消费者代码。
  • 关于手动实现工厂包装类的问题:上述方案不需要额外编写工厂包装类,注册逻辑仅需几行代码,批量注册的情况下开销几乎为零。
  • 关于带参数的注册重载:Register<TService>(Func<TService>) 确实仅支持无参实例创建,但你不需要使用该重载,直接注册工厂委托、调用 GetInstance 传入运行时参数即可满足需求。

内容的提问来源于stack exchange,提问作者gusmally supports Monica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:02