我使用Autofac nuget包Autofac.Web
继承了一些旧的ASP.NET Webforms代码。我注意到配置定义了 PropertyInjection
模块和AttributedInjection
模块 - 这违反了明确指出的文档here:
首先,从您的web.config文件中删除
PropertyInjectionModule
,然后将其替换为AttributedInjectionModule
但是web.config中的autofac条目看起来像这样(在httpModules
中有类似的设置):
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="ContainerDisposal" ... etc .../>
<!-- Should next line be removed? -->
<add name="PropertyInjection" ... etc .../>
<add name="AttributedInjection" ... etc .../>
</modules>
</system.webServer>
应用程序中的页面通常使用[InjectUnsetProperties]
属性。
在大多数情况下,应用程序似乎有效 - 但是有一些奇怪的问题可能与DI相关。更改配置以遵循文档显然会涉及大量的重新测试工作 - 不用说在这个旧代码中自动化测试并不广泛。
我没有在Webforms中使用Autofac的经验 - 任何人都可以解释上述错误配置的影响以及它可能导致的问题(如果有的话)吗?另外,相反,删除PropertyInjection
模块的潜在影响是什么?
答案 0 :(得分:2)
如果你有两个模块,两个模块都会运行,两个模块都会完成注射工作。
问题在于AttributedInjectionModule
更具限制性 - 它只会在你明确告诉它的地方注入 - 而PropertyInjectionModule
有更广泛的覆盖 - 它总是注入。两者都会导致属性失去控制权,因为PropertyInjectionModule
无论如何都会注入所有内容。
您也可能遇到一些问题,其中一些依赖类型被实例化两次 - 一次为管道中的每个模块注入。
如果您移除了PropertyInjectionModule
,那么只会将注入的内容注入,并且您将保留更精细的控件。