Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net 在Unity中,依赖关系何时通过反射确定?_.net_Reflection_Dependency Injection_Dependencies_Unity Container - Fatal编程技术网

.net 在Unity中,依赖关系何时通过反射确定?

.net 在Unity中,依赖关系何时通过反射确定?,.net,reflection,dependency-injection,dependencies,unity-container,.net,Reflection,Dependency Injection,Dependencies,Unity Container,除了注册的依赖项之外,通过反射确定的依赖项(例如注入的依赖项)是在依赖项的生存期内还是在DI容器的生存期内完成的 编辑:心目中的DI容器是统一的 编辑:精化:我很好奇反射过程发生了多少次,还想弄清楚Unity构建中使用反射的阶段是否会找到构造函数和属性。根据MSDN(),Unity构建的第四个阶段是“预创建”,即“第四个阶段。对构造函数、属性等的反射在这里执行。”这个阶段运行了多少次?在构建容器期间,还是每次需要解决构造函数和属性依赖关系时?这发生在寄存器解析发布模式的哪个部分?Unity使用名

除了注册的依赖项之外,通过反射确定的依赖项(例如注入的依赖项)是在依赖项的生存期内还是在DI容器的生存期内完成的

编辑:心目中的DI容器是统一的


编辑:精化:我很好奇反射过程发生了多少次,还想弄清楚Unity构建中使用反射的阶段是否会找到构造函数和属性。根据MSDN(),Unity构建的第四个阶段是“预创建”,即“第四个阶段。对构造函数、属性等的反射在这里执行。”这个阶段运行了多少次?在构建容器期间,还是每次需要解决构造函数和属性依赖关系时?这发生在寄存器解析发布模式的哪个部分?

Unity使用名为
StrategyChain
的构建管道来创建对象。每次从容器解析对象时,都会运行此管道

管道中的每一步都作为一项战略实施。这些策略查找的值称为
BuilderPolicies
。这些策略封装了策略积累的信息(比如使用反射来确定要使用的构造函数、要注入的属性等)。第一次为特定类型运行管道时,策略将策略放入名为
PolicyList
的存储中。下次要求管道构建该类型时,这些值将被重用,因此所涉及的工作只需花费您一次


更新


我猜你是说ASP.NET?实际上有两个
策略列表。通过
策略链
(瞬态)只存在一个周期的一个,以及与容器寿命耦合的一个。只要您的
UnityContainer
实例未被处置或垃圾收集,它就会一直存在。您可能感兴趣的一件事是:您不能序列化您的容器。因此,您无法告诉运行在web场上的应用程序将其存储在缓存中并在服务器之间共享。

每个DI容器的工作方式不同。你有没有特别的想法?是的,我一直在使用的DI容器是Unity。我编辑了这个问题以反映这一点。我不清楚这里到底问了什么。你能详细说明一下吗?也许包括你提问的原因?@MarkSeemann-我编辑了详细说明,我希望这能澄清问题。我想知道你为什么想知道这个?保单的生命周期是什么?在.net的场景中,是每会话一次吗?谢谢你的更新,我很感激。假设每个解析的对象都立即被释放(使用它所需的时间接近0毫秒)。100次解析和释放一个对象将只使用反射来确定管道一次(只要容器未被垃圾收集)?@TravisJ如果您的对象注册了瞬态/每解析生存期,它们将被解析、使用,然后像任何其他CLR对象一样被垃圾收集。如果使用单实例生存期注册,则该单实例将被重用,因此不会被收集。在第一次解析之后,容器应该不需要再次使用反射。