在实例化一个类时,Windsor 默认将类的所有公共属性视为可选依赖项并尝试满足它们。就我而言,这会创建一个相当复杂的循环依赖,导致我的应用程序挂起。
我如何明确告诉温莎城堡它不应该试图满足公共财产的要求?我认为一定有那个程度的属性。但是我找不到它,所以请让我知道适当的命名空间/程序集。
如果有任何方法可以在没有属性(例如 Xml 配置或通过代码配置)的情况下执行此操作,那将是更可取的,因为发生这种情况的特定库迄今为止不需要依赖于 castle。
在实例化一个类时,Windsor 默认将类的所有公共属性视为可选依赖项并尝试满足它们。就我而言,这会创建一个相当复杂的循环依赖,导致我的应用程序挂起。
我如何明确告诉温莎城堡它不应该试图满足公共财产的要求?我认为一定有那个程度的属性。但是我找不到它,所以请让我知道适当的命名空间/程序集。
如果有任何方法可以在没有属性(例如 Xml 配置或通过代码配置)的情况下执行此操作,那将是更可取的,因为发生这种情况的特定库迄今为止不需要依赖于 castle。
您可以使用Castle.Core.DoNotWireAttribute属性来阻止 IoC 容器连接属性(这是在 Castle.Core 程序集中,这意味着您的库只需要依赖于轻量级 Castle.Core 程序集 -例如,如果您想在完全不反转控制容器的情况下使用代码,或者在不同的 IoC 容器中使用)。
我不相信有任何方法可以防止在 Xml 配置中发生连线,但是添加对此的支持相当容易 - 如果我必须这样做,我可能会:
另一种可能对您有用的方法是在请求任何服务实例之前手动从模型中删除依赖项,即。
kernel.GetHandler(typeof(MyComponent)).ComponentModel.Dependencies.RemoveAll(d => d.DependencyKey == "PropertyThatShouldNotBeWired");
不过,使用这种方法的 YMMV - 特别是如果您有可启动的服务或其他设施,它们可能会在注册后急切地实例化您的组件。
我创建了一个工具来帮助解决这个问题:
我不知道你们当时使用的是哪个版本的 Castle,但提到的解决方案都没有奏效。另外,还有很多死链接。
使用城堡 3.1,这里是我想出的解决方案(感谢一些城堡源代码挖掘):
container.Register(Component.For(type)
.LifestyleTransient()
.Properties( propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType)));
'Properties' 函数在构造 ComponentModel 时添加了由 castle 使用的属性过滤器。在我的情况下,除了属性类型“MyOtherType”之外,所有属性依赖都将得到满足。
也许它会对某人有所帮助。在 Windsor 4.1 中,注册期间有 PropertiesIgnore 方法。
Component.For<Role>().LifestyleTransient().PropertiesIgnore((model, propertyInfo) => true)
这可以通过以下代码实现:
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);
在这里也发布在谷歌群组论坛上:http ://groups.google.com/group/castle-project-devel/browse_thread/thread/43aa513817bd057a