SimpleInjector - "Lazy"实例化一个依赖于首次使用的单例

Jer*_*acs 1 c# singleton inversion-of-control simple-injector

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

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

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

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

Oli*_*bes 5

SimpleInjector允许您注册工厂代理.

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

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

  • `System.Lazy <T>`是一个.NET类; 没有什么简单的注入器特定于`Lazy <T>`. (2认同)