2008-10-07 20 views
10

当实例化一个类时,Windsor默认将该类的所有公共属性视为可选依赖项,并试图满足它们。在我的情况下,这会创建一个相当复杂的循环依赖关系,导致我的应用程序挂起。温莎集装箱:如何指定一个公共财产不应该由容器填充?

我怎样才能明确告诉温莎城堡它不应该试图满足公共财产?我假设必须有这样的属性。我找不到它,所以请让我知道适当的命名空间/程序集。

如果有任何方法可以不使用属性(如Xml Configuration或通过代码进行配置)来完成此操作,那么会更好,因为发生此事的特定库至今不需要依赖Castle。

+0

将此问题添加到Windsor常见问题解答中:http://using.castleproject.org/display/IoC/FAQ – 2010-01-24 17:14:33

回答

11

可以使用Castle.Core.DoNotWireAttribute属性由IoC容器被有线了停止特性(这是Castle.Core程序集,这意味着你的库只需要依赖轻量级的Castle.Core程序集 - 例如,如果你想使用c在没有控制容器的情况下,或者在不同的IoC容器中)。

我不相信有什么办法可以防止接线从XML配置发生,但它是相当容易地添加这种支持 - 如果我不得不这样做,我可能会:

  1. 引入某种属性对属性声明中的XML:< myprop丝=“假”/>
  2. 继承PropertiesDependenciesModelInspector,重写InspectProperties方法一些额外的逻辑适用于识别哪些属性应该作为依赖关系添加到组件模型中(检查模型。wire =“false”属性/值对的配置)。
  3. 继承DefaultComponentModelBuilder和覆盖InitializeContributors包括您更换PropertiesDependenciesModelInspector - 或者只是删除现有的性能贡献者,在运行时通过AddContributor/RemoveContributor方法添加你自己的。
  4. 替换分​​配给容器内核的服务实例的ComponentModelBuilder

可以为你工作的另一种方法是在请求服务的任何实例之前手动删除模型中的依赖关系,即,

kernel.GetHandler(typeof(MyComponent))。ComponentModel.Dependencies.RemoveAll(d => d。DependencyKey ==“PropertyThatShouldNotBeired”);

虽然YMMV采用这种方法 - 尤其是如果您有可启动的服务或其他可能在注册后急需实例化您的组件的设施。

+0

该代码示例在2.5.x中不起作用 - RemoveAll()方法已消失。有其他选择吗? – 2011-08-02 12:14:01

+0

P.S.我正在使用流畅的注册API。 – 2011-08-02 14:06:59

2

我不知道哪个城堡,你的版本当时人们正在使用,但没有提到的解决方案正在工作。另外,还有很多死链接。

与城堡3.1,这里的解决方案,我想出了(由于一些城堡的源代码挖掘):

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

的“属性”功能将构建ComponentModel时所使用的城堡属性过滤器。在我的情况下,除了属性类型'MyOtherType'外,所有的属性依赖都会被满足。