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

