SimpleInjector - "懒惰"实例化具有首次使用依赖性的单例

时间:2017-04-26 20:30:24

标签: c# singleton inversion-of-control simple-injector

我们有一个控制台应用程序可以执行许多不同的操作。很多不同的东西,它的作用取决于我们作为命令行参数传递的内容。它最初是以这种方式构建的,因此它只占用了我们的构建服务器中的一个许可位置,并且在建议将其拆分时我遇到了一堆阻力。

这个应用程序使用SimpleInjector for IoC ...问题是,我们有一堆单独的服务没有用于任何给定的操作,并且它们在每次使用时加载......这非常慢。我只想加载实际用于任何给定操作的依赖项。

看起来Lazy<TService>附近有很多文档,但实际上它非常令人沮丧。似乎Lazy构造函数不知道它正在使用的容器,因此它必须使用无参数构造函数或值工厂,它似乎也不知道依赖项所在的容器。

我想用SimpleInjector做些什么?我一直在玩各种版本的Lazy泛型,但我似乎无法得到我想要的东西。

1 个答案:

答案 0 :(得分:5)

SimpleInjector允许您register factory delegates

// From the link above, chapter "Lazy"
container.Register<Lazy<IMyService>>(
    () => new Lazy<IMyService>(container.GetInstance<RealService>));

另一种可能性是使用decorator。 SimpleInjector也可以让你这样做。优于第一个解决方案(您必须调用lazyService.Value.DoSomething();)的优点是,您可以使此更改透明。即装饰器实现服务,您可以调用decoratedService.DoSomething();