13

クラスをインスタンス化するとき、Windsor はデフォルトでクラスのすべてのパブリック プロパティをオプションの依存関係として扱い、それらを満たすようにします。私の場合、これはかなり複雑な循環依存関係を作成し、アプリケーションをハングさせます。

公共の財産を満足させようとしてはならないことをウィンザー城に明示的に伝えるにはどうすればよいですか? その程度の属性があるに違いないと思います。しかし、見つからないので、適切な名前空間/アセンブリを教えてください。

属性なしでこれを行う方法がある場合 (Xml 構成やコードによる構成など)、これが行われている特定のライブラリはこれまで城への依存を必要としなかったため、それが望ましいでしょう。

4

7 に答える 7

11

Castle.Core.DoNotWireAttribute属性を使用して、プロパティが IoC コンテナーによって接続されるのを停止できます (これは Castle.Core アセンブリにあります。つまり、ライブラリは軽量の Castle.Core アセンブリに依存するだけで済みます。たとえば、コントロール コンテナーを完全に反転せずにコードを使用する場合、または別の IoC コンテナーでコードを使用する場合)。

Xml構成で配線が発生するのを防ぐ方法はないと思いますが、これのサポートを追加するのはかなり簡単です-これを行う必要がある場合、おそらく次のようにします:

  1. xml のプロパティ宣言にある種の属性を導入します: <myprop wire="false" />
  2. PropertiesDependenciesModelInspectorから継承し、 InspectPropertiesメソッドをオーバーライドして、コンポーネント モデルに依存関係として追加する必要があるプロパティを特定する追加のロジックを適用します (wire="false" 属性/値のペアについて model.Configuration を調べます)。
  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 の構築時に城によって使用されるプロパティ フィルターを追加します。私の場合、プロパティ タイプ 'MyOtherType' を除いて、すべてのプロパティの依存関係が満たされます。

于 2013-09-16T15:31:23.020 に答える
0

これを Google グループ フォーラムにも投稿しました: http://groups.google.com/group/castle-project-devel/browse_thread/thread/43aa513817bd057a

于 2008-10-08T13:40:12.443 に答える