Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用autofac注册的类比需要的多,这不好吗?_C#_Dependency Injection_Ioc Container_Autofac - Fatal编程技术网

C# 使用autofac注册的类比需要的多,这不好吗?

C# 使用autofac注册的类比需要的多,这不好吗?,c#,dependency-injection,ioc-container,autofac,C#,Dependency Injection,Ioc Container,Autofac,我想在几个不同的web项目中使用通用的Autofac模块 其中一个项目不需要在我的公共模块中注册所有的类(它使用了大约一半的类)。我的猜测是,如果一个类被注册但从未被调用,它将不会被解析,因此不会占用额外的内存 这是好的还是坏的做法?谢谢性能方面可能没有,但是 …这意味着您还必须向项目添加不需要的引用。我会避免使用它,以尽可能降低依赖项的数量。在我看来,注册依赖项是属于您的应用程序的,而不是跨多个应用程序共享的。毕竟,生命周期之类的事情可能因应用程序而异。我认为Autofac(或任何DI容器)消

我想在几个不同的web项目中使用通用的Autofac模块

其中一个项目不需要在我的公共模块中注册所有的类(它使用了大约一半的类)。我的猜测是,如果一个类被注册但从未被调用,它将不会被解析,因此不会占用额外的内存


这是好的还是坏的做法?谢谢

性能方面可能没有,但是


…这意味着您还必须向项目添加不需要的引用。我会避免使用它,以尽可能降低依赖项的数量。在我看来,注册依赖项是属于您的应用程序的,而不是跨多个应用程序共享的。毕竟,生命周期之类的事情可能因应用程序而异。

我认为Autofac(或任何DI容器)消耗的额外内存量是最小的,如果这些类型永远无法解析的话。容器具有延迟加载机制,可防止缓慢启动。当一个类型第一次解析时,容器通常会在后台生成大量代码和内存,以便能够在以后的任何请求中快速解析该类型。但请注意,包含某种“验证”功能的容器通常会强制创建实例,从而触发整个构建和编译过程。因此,如果在启动期间调用此验证功能,将失去延迟加载的好处

一些开发人员甚至更进一步,通知容器对所有程序集进行反射,并注册其接口找到的任何类型。在执行此操作时,您可能会看到容器中有很多类型,这些类型从未使用过,实际上也无法解析(因为它们不是由容器创建的)。这样做的目的是使容器配置非常简单,并且他们不关心额外的垃圾

尽管这可以简化容器的配置,但这种方法的缺点是,这使得进行简单的集成测试来验证DI配置的正确性变得更加困难,因为会有很多误报;测试将不断失败,因为容器中存在大量无效注册。如果您的容器包含某种允许检测常见错误配置的诊断服务,情况会变得更糟。同样,这种配置将触发大量误报,甚至可能完全禁用此功能(取决于您使用的框架)


这就是为什么我通常建议不要进行这种类型的批注册(尽管我并不反对批注册本身)。

如果您的程序没有很高的吞吐量以及大量的依赖项和解析量,那么应该完全可以。@VladimirSachek:即使在这种情况下,它也不会对吞吐量产生可测量的影响,由于Autofac在内部使用字典,因此您应该期望在添加更多注册时解析速度不会变慢。我的容器使用延迟加载,而且我们没有任何自动测试来验证反映所有程序集和类型的DI配置(我们可能应该…),这也会造成更糟糕的情况,例如:public class Dummy:IDummy public class Dummy 2:IDummy当您解析IDummy时,您不知道是否会得到Dummy或Dummy 2的实例,我将其称为灾难配方。@catflier:使用Autofac,这确实是个问题。这就是为什么我喜欢显式地将集合的注册与API的其余部分分开的容器。我同意,但在我的情况下,这些注册可能会保持不变。共享这些依赖关系的应用程序非常相似。当添加依赖项时,我们通常会在其他项目上添加它,这就是我们希望使用公共模块的原因。