2017-04-26 18 views
0

我们有一个控制台应用程序,它执行许多不同的事情。很多不同的事情,它的作用取决于我们作为命令行参数传入的内容。它最初是以这种方式构建的,所以它只在我们的构建服务器中占用了一个许可位置,并且在提出拆分时遇到了一些阻力。SimpleInjector - “Lazy”实例化一个具有第一次使用依赖关系的单例

这个应用程序使用SimpleInjector的IoC ...问题是,我们有一堆单身人士的服务,没有用于任何给定的操作,并且他们加载每次使用...这是令人生厌的慢。我只想加载实际用于任何给定操作的依赖关系。

看起来好像围绕着Lazy<TService>有很多文档,但实际上很令人沮丧。看来懒惰的构造函数并不知道它正在使用的容器,所以它必须使用无参数的构造函数或价值工厂,它似乎也不知道依赖项所在的容器。

是我想做的事SimpleInjector?我一直在玩Lazy generic的各种版本,但我似乎无法得到我想要的。

+0

“我们有一堆单独的服务不用于任何给定的操作,并且每次使用都会加载......这太令人厌烦了。”这是你要详细说明的,因为Simple Injector速度很快,并且类的创建[应该很快](http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)。为什么这很慢? – Steven

+0

@Steven单例类本身很慢实例化。其中许多是API消费者,它从远程站点收集身份验证令牌或其他内容,或者在内部构建缓存。 –

+0

我想(再次)参考[这篇文章](http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)。你不应该在构造函数中做任何计算相关性。如果你需要建立一个缓存,那就懒洋洋地去做吧:不是在建设过程中。 – Steven

回答

3

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();

+0

从我读的内容来看,这需要我在我的单例类中注入'Lazy '作为依赖项,这会将我的服务耦合到SimpleInjector。这不正确吗? –

+2

'System.Lazy '是一个.NET类;没有什么特别针对'懒惰'的简单喷射器。 – Steven

+0

我......没有意识到这一点。我会仔细看看的。 –

相关问题