Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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# IOC容器程序集扫描性能_C#_Dependency Injection_Inversion Of Control_Autofac - Fatal编程技术网

C# IOC容器程序集扫描性能

C# IOC容器程序集扫描性能,c#,dependency-injection,inversion-of-control,autofac,C#,Dependency Injection,Inversion Of Control,Autofac,基于约定的程序集扫描是个好主意吗?目前我有一些 foreach(var type in assembly) { if(isRepository(type)) registerAsRepository(type); } 这在启动时需要1秒以上。我想知道手工注册所有类型,并在测试中实现某种“注册测试”,而不是在运行时进行注册测试,是否会更好?我喜欢这个问题。这很简单,但它涉及到问题空间的许多方面 就像软件(IoC)中的许多东西一样,容器不是万能的。它们以运行时性能级别换取运

基于约定的程序集扫描是个好主意吗?目前我有一些

foreach(var type in assembly)
{
    if(isRepository(type))
        registerAsRepository(type);
}

这在启动时需要1秒以上。我想知道手工注册所有类型,并在测试中实现某种“注册测试”,而不是在运行时进行注册测试,是否会更好?

我喜欢这个问题。这很简单,但它涉及到问题空间的许多方面

就像软件(IoC)中的许多东西一样,容器不是万能的。它们以运行时性能级别换取运行时灵活性和开发时生产率级别

和所有工具一样,它们在正确使用时工作得最好。而且,由于容器管理应用程序中对象的生命周期,因此这里的适当部分指的是应用程序的结构

现在,很难给出没有细节的具体建议,所以我将相当笼统

首先,扫描单个组件的1s开销对于任何类似现代硬件的东西都是高度可疑的。很难从您发布的伪代码判断真正代码中的问题可能在哪里,但显然存在问题,而且很可能不是您的容器。我还建议不要自己进行这种低级别扫描,而是依赖容器提供的高级别API。它通常会比任何像这样的自定义代码更高效、更可读


然后是建筑的问题。容器是一个锐利的工具,尽管它们的API很简单,但它为您提供了一系列的选项。您在注释中给出的所有示例都可以通过按约定注册、显式类型注册和一些配置的组合轻松处理。我想请您参考所选容器的文档,了解其具体内容,但这是一个标准场景,所有成熟容器都能很好地处理此问题,并且性能超出可接受范围。

请阅读和。这是一个很好的惯例。然而,我不喜欢这样一个事实,即约定必须在运行时处理所有程序集中的所有类型,而且我无法轻松地预计算它。当惯例改变时,它也变得更加困难,例如,您有在mysql上工作的全文搜索IQueryHandler,但突然之间您有了sphinx服务,它可以做同样的事情。或者您需要基于配置的交换服务。或者您有两套IQueryHandler,一套用于oracle,另一套用于mysql(在一个程序集中)。然后呢?OOTB autofac注册商不会处理这种约定。我建议根本不要使用容器。容器是可选的工具。当您对配置和批注册执行约定时,它会变得非常强大。如果您的应用程序足够小,那么这样做可能更有价值。“这在启动时需要1秒以上。”。您是否也在生产环境中(在发布模式下)进行了测试?您是只扫描应用程序程序集还是扫描所有加载的程序集(包括System.*程序集)?如果将可交换组件组放置到一个单独的程序集中,它会工作吗?在这种情况下,您只需在批注册期间将该程序集换成另一个程序集。您可以使用.Oracle.dll和.MySql.dll对它们进行后缀修复。谢谢您的回答。显然,1秒的启动时间只是di的成本,我只是对新项目比旧项目启动慢感到难过;)。你能给我举一个这样的按约定注册的例子吗?你想在一个程序集中只为MySql注册处理程序,而不为Oracle注册处理程序?(我的意思是,它们仅在依赖性方面有所不同)