C# 简易注射器;“懒惰”;实例化依赖于首次使用的单例

C# 简易注射器;“懒惰”;实例化依赖于首次使用的单例,c#,singleton,inversion-of-control,simple-injector,C#,Singleton,Inversion Of Control,Simple Injector,我们有一个控制台应用程序,可以做很多不同的事情。很多不同的事情,它的作用取决于我们作为命令行参数传入的内容。它最初是以这种方式构建的,因此它只占用构建服务器中的一个许可点,当建议将其拆分时,我遇到了很多阻力 此应用程序使用简单的IoC注入器。。。问题是,我们有一堆单例服务,它们不用于任何给定的操作,每次使用都会加载它们。。。这是令人烦恼的缓慢。我只想加载实际用于任何给定操作的依赖项 看起来有很多关于懒惰的文档,但在实践中,这是相当令人沮丧的。懒惰构造函数似乎不知道它所使用的容器,因此它必须使用无

我们有一个控制台应用程序,可以做很多不同的事情。很多不同的事情,它的作用取决于我们作为命令行参数传入的内容。它最初是以这种方式构建的,因此它只占用构建服务器中的一个许可点,当建议将其拆分时,我遇到了很多阻力


此应用程序使用简单的IoC注入器。。。问题是,我们有一堆单例服务,它们不用于任何给定的操作,每次使用都会加载它们。。。这是令人烦恼的缓慢。我只想加载实际用于任何给定操作的依赖项

看起来有很多关于懒惰的文档,但在实践中,这是相当令人沮丧的。懒惰构造函数似乎不知道它所使用的容器,因此它必须使用无参数构造函数或值工厂,该构造函数或值工厂似乎也不知道依赖项所在的容器


我想用简单的喷油器做什么?我一直在玩各种版本的Lazy generic,但我似乎无法得到我想要的。

Simple Injector允许您这样做

//从上面的链接“懒惰”一章
集装箱。登记(
()=>newlazy(container.GetInstance));

另一种可能性是使用。简单的喷油器也允许您这样做。与第一个解决方案(您必须调用
lazyService.Value.DoSomething();
)相比,它的优势在于,您可以使此更改透明化。也就是说,decorator实现服务,您可以调用
decoratedService.DoSomething()

简单喷油器允许您进行以下操作

//从上面的链接“懒惰”一章
集装箱。登记(
()=>newlazy(container.GetInstance));

另一种可能性是使用。简单的喷油器也允许您这样做。与第一个解决方案(您必须调用
lazyService.Value.DoSomething();
)相比,它的优势在于,您可以使此更改透明化。也就是说,decorator实现服务,您可以调用
decoratedService.DoSomething()

“我们有一堆单例服务,它们不用于任何给定的操作,每次使用都会加载它们……这太慢了。”这是您必须详细说明的事情,因为Simple Injector很快,而且创建类也很快。为什么这么慢?@Steven单例类本身实例化起来很慢。他们中的许多人都是API使用者,它从远程站点收集身份验证令牌或其他东西,或者在内部构建缓存。您不应该在构造函数中执行任何与计算相关的操作。如果你需要建立一个缓存,那就懒洋洋地做:不要在构建过程中做。@Steven你说的是最佳实践,而这个奇美拉模型并不能代表最佳实践。到处都在使用这段弗兰肯斯坦的代码,我们被禁止重构它。我必须从我现在的位置开始工作。“我们有一堆单例服务,它们不用于任何给定的操作,每次使用都会加载它们……这太慢了。”这是您必须详细说明的事情,因为Simple Injector很快,而且创建类也很快。为什么这么慢?@Steven单例类本身实例化起来很慢。他们中的许多人都是API使用者,它从远程站点收集身份验证令牌或其他东西,或者在内部构建缓存。您不应该在构造函数中执行任何与计算相关的操作。如果你需要建立一个缓存,那就懒洋洋地做:不要在构建过程中做。@Steven你说的是最佳实践,而这个奇美拉模型并不能代表最佳实践。到处都在使用这段弗兰肯斯坦的代码,我们被禁止重构它。我必须从我现在的位置工作。据我所知,这要求我在我的单例类中注入
Lazy
作为依赖项,它将我的服务耦合到SimpleInjector。这不是真的吗?
System.Lazy
是一个.NET类;没有任何简单的喷油器专门用于
Lazy
。。。没有意识到这一点。不过,有不同的原因说明注入
惰性
可能是个坏主意。这些文档已经“不再使用惰性依赖项污染应用程序的API,而是将惰性隐藏在代理后面通常更干净,如下面的示例所示。”。如前所述,
Lazy
的使用违反了DIP。关于Oliver的更新,您可以将
Func
注入到您的装饰器中;它们也可以允许延迟创建。据我所知,这要求我在我的单例类中注入
Lazy
作为依赖项,它将我的服务耦合到SimpleInjector。这不是真的吗?
System.Lazy
是一个.NET类;没有任何简单的喷油器专门用于
Lazy
。。。没有意识到这一点。不过,有不同的原因说明注入
惰性
可能是个坏主意。这些文档已经“不再使用惰性依赖项污染应用程序的API,而是将惰性隐藏在代理后面通常更干净,如下面的示例所示。”。如前所述,
Lazy
的使用违反了DIP。关于Oliver的更新,您可以将
Func
注入到您的装饰器中;它们也允许延迟创建。