gpt4 book ai didi

inversion-of-control - 温莎容器 : How to specify a public property should not be filled by the container?

转载 作者:行者123 更新时间:2023-12-04 00:43:36 26 4
gpt4 key购买 nike

在实例化一个类时,Windsor 默认将类的所有公共(public)属性视为可选依赖项并尝试满足它们。就我而言,这会创建一个相当复杂的循环依赖,导致我的应用程序挂起。

我如何明确告诉温莎城堡它不应该试图满足公共(public)属性(property)的要求?我认为一定有那个程度的属性。但是我找不到它,所以请让我知道适当的命名空间/程序集。

如果有任何方法可以在没有属性(例如 Xml 配置或通过代码配置)的情况下执行此操作,那将是更可取的,因为发生这种情况的特定库迄今为止不需要依赖于 caSTLe。

最佳答案

您可以使用 Castle.Core.DoNotWireAttribute属性来阻止 IoC 容器连接属性(这是在 CaSTLe.Core 程序集中,这意味着您的库只需要依赖于轻量级 CaSTLe.Core 程序集 - 例如,如果您想使用代码完全没有控制容器的反转,或者在不同的 IoC 容器中)。

我不相信有任何方法可以防止在 Xml 配置中发生连线,但是添加对此的支持相当容易 - 如果我必须这样做,我可能会:

  • 在 xml 中的属性声明中引入某种属性:
  • 继承自 PropertiesDependenciesModelInspector ,覆盖 检查属性 方法应用一些额外的逻辑来识别哪些属性应该作为依赖项添加到组件模型中(检查 model.Configuration 中的 wire="false"属性/值对)。
  • 继承自 DefaultComponentModelBuilder并覆盖 初始化贡献者 包括您的替换 PropertiesDependenciesModelInspector - 或者只是删除现有的属性贡献者并在运行时通过 添加自己的属性。添加贡献者/移除贡献者 方法。
  • 替换 组件模型构建器 分配给容器内核的服务实例。

  • 另一种可能对您有用的方法是在请求任何服务实例之前手动从模型中删除依赖项,即。

    kernel.GetHandler(typeof(MyComponent)).ComponentModel.Dependencies.RemoveAll(d => d.DependencyKey == "PropertyThatShouldNotBeWired");

    不过,使用这种方法的 YMMV - 特别是如果您有可启动的服务或其他设施,它们可能会在注册后急切地实例化您的组件。

    关于inversion-of-control - 温莎容器 : How to specify a public property should not be filled by the container?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/178611/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com