13

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

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

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

4

7 回答 7

11

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

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

  1. 在 xml 中的属性声明上引入某种属性:<myprop wire="false" />
  2. PropertiesDependenciesModelInspector继承,重写InspectProperties方法以应用一些额外的逻辑来识别哪些属性应该作为依赖项添加到组件模型(检查 model.Configuration 中的 wire="false" 属性/值对)。
  3. 从DefaultComponentModelBuilder继承并覆盖InitializeContributors以包含您的替换PropertiesDependenciesModelInspector - 或者只是删除现有的属性贡献者并在运行时通过AddContributor / RemoveContributor方法添加您自己的。
  4. 替换分配给容器内核的ComponentModelBuilder服务实例。

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

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

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

于 2008-10-08T10:03:40.027 回答
3

我创建了一个工具来帮助解决这个问题:

于 2009-09-01T15:29:12.147 回答
2

我不知道你们当时使用的是哪个版本的 Castle,但提到的解决方案都没有奏效。另外,还有很多死链接。

使用城堡 3.1,这里是我想出的解决方案(感谢一些城堡源代码挖掘):

container.Register(Component.For(type)
                                        .LifestyleTransient()
                                        .Properties( propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType)));

'Properties' 函数在构造 ComponentModel 时添加了由 castle 使用的属性过滤器。在我的情况下,除了属性类型“MyOtherType”之外,所有属性依赖都将得到满足。

于 2013-09-16T15:31:23.020 回答
2

也许它会对某人有所帮助。在 Windsor 4.1 中,注册期间有 PropertiesIgnore 方法。

Component.For<Role>().LifestyleTransient().PropertiesIgnore((model, propertyInfo) => true)
于 2018-11-21T17:44:46.893 回答
1

这可以通过以下代码实现:

var container = new WindsorContainer();

// We don't want to inject properties, only ctors
var propInjector = container.Kernel.ComponentModelBuilder
                         .Contributors
                         .OfType<PropertiesDependenciesModelInspector>()
                         .Single();
container.Kernel.ComponentModelBuilder.RemoveContributor(propInjector);

城堡温莎文档

于 2019-02-12T15:36:24.170 回答
0

在这里也发布在谷歌群组论坛上:http ://groups.google.com/group/castle-project-devel/browse_thread/thread/43aa513817bd057a

于 2008-10-08T13:40:12.443 回答