简单注入器 - "Lazy" 实例化一个依赖于首次使用的单例
Simple Injector - "Lazy" Instantiate a singleton that has dependencies on first use
我们有一个控制台应用程序可以做很多不同的事情。很多不同的东西,它的作用取决于我们作为命令行参数传入的内容。它最初是以这种方式构建的,因此它只占用了我们构建服务器中的一个许可位置,我在建议将其拆分时遇到了一堆阻力。
此应用程序使用 IoC 的简单注入器...问题是,我们有一堆未用于任何给定操作的单例服务,每次使用它们都会加载...这太慢了.我只想加载实际用于任何给定操作的依赖项。
Lazy<TService>
似乎有很多文档,但实际上这很令人沮丧。惰性构造函数似乎不知道它正在使用的容器,因此它必须使用无参数构造函数或值工厂,它们似乎也不知道依赖项所在的容器。
我想用 Simple Injector 做些什么?我一直在玩各种版本的 Lazy 泛型,但我似乎无法得到我想要的东西。
简单注入器允许您register factory delegates。
// From the link above, chapter "Lazy"
container.Register<Lazy<IMyService>>(
() => new Lazy<IMyService>(container.GetInstance<RealService>));
另一种可能性是使用 decorator。 Simple Injector 也允许您这样做。与第一个解决方案(您必须调用 lazyService.Value.DoSomething();
)相比的优势在于,您可以使此更改透明化。 IE。装饰器实现了服务,你可以调用 decoratedService.DoSomething();
我们有一个控制台应用程序可以做很多不同的事情。很多不同的东西,它的作用取决于我们作为命令行参数传入的内容。它最初是以这种方式构建的,因此它只占用了我们构建服务器中的一个许可位置,我在建议将其拆分时遇到了一堆阻力。
此应用程序使用 IoC 的简单注入器...问题是,我们有一堆未用于任何给定操作的单例服务,每次使用它们都会加载...这太慢了.我只想加载实际用于任何给定操作的依赖项。
Lazy<TService>
似乎有很多文档,但实际上这很令人沮丧。惰性构造函数似乎不知道它正在使用的容器,因此它必须使用无参数构造函数或值工厂,它们似乎也不知道依赖项所在的容器。
我想用 Simple Injector 做些什么?我一直在玩各种版本的 Lazy 泛型,但我似乎无法得到我想要的东西。
简单注入器允许您register factory delegates。
// From the link above, chapter "Lazy"
container.Register<Lazy<IMyService>>(
() => new Lazy<IMyService>(container.GetInstance<RealService>));
另一种可能性是使用 decorator。 Simple Injector 也允许您这样做。与第一个解决方案(您必须调用 lazyService.Value.DoSomething();
)相比的优势在于,您可以使此更改透明化。 IE。装饰器实现了服务,你可以调用 decoratedService.DoSomething();