我们有一个控制台应用程序可以执行许多不同的操作。很多不同的东西,它的作用取决于我们作为命令行参数传递的内容。它最初是以这种方式构建的,因此它只占用了我们的构建服务器中的一个许可位置,并且在建议将其拆分时我遇到了一堆阻力。
这个应用程序使用SimpleInjector for IoC ...问题是,我们有一堆单独的服务没有用于任何给定的操作,并且它们在每次使用时加载......这非常慢。我只想加载实际用于任何给定操作的依赖项。
看起来Lazy<TService>
附近有很多文档,但实际上它非常令人沮丧。似乎Lazy构造函数不知道它正在使用的容器,因此它必须使用无参数构造函数或值工厂,它似乎也不知道依赖项所在的容器。
我想用SimpleInjector做些什么?我一直在玩各种版本的Lazy泛型,但我似乎无法得到我想要的东西。
答案 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();