FxCopのCollectionPropertiesShouldBeReadOnlyルールは、スプリングフレームワークと互換性がありませんか?
-
03-07-2019 - |
質問
FxCopには CollectionPropertiesShouldBeReadOnlyルールがありますクライアントが設定できるコレクションプロパティの。代わりに、プロパティを読み取り専用にし、コレクションのコンテンツを変更するためのClear()メソッドとAdd()またはAddRange()メソッドを提供することをお勧めします。
これにより、よりクリーンで制御されたインターフェースが実現することに同意しますが、そのインターフェースをSpringフレームワークで動作させるのに苦労しています。共同編集者のコレクションを使用してオブジェクトを構成する場合は、共同編集者を注入するコレクションプロパティを公開する必要があります。 Springのドキュメントに目を通しました。 AddRange()メソッドを呼び出すようにSpringに指示する方法がありません。何か不足していますか?
今のところ、Springの構成に必要であるという注意とともに警告を除外します。
更新:過去2か月間にニブルを取得しなかったため、 FxCopフォーラム。
解決
コレクションプロパティにgetterのみが公開されている場合、リストしたFxCop推奨パターンが使用されていると想定し、コレクションに追加します。最初のパターンもサポートされています。
汎用コレクションの場合、これは公開されたプロパティがIList型の場合にのみ機能します。これを修正する次のリリースでは、 JIRAの問題があります。ところで、これは基本クラスライブラリで非常に一般的なパターンです(おそらくご存知でしょうが...).NET 1.1でこのスタイルをサポートする必要性に最初に遭遇した場所です(上記の制限を受けません)。 。
乾杯、 マーク
他のヒント
問題はあなたが考えているほど悪いですか?私の理解では、次のような読み取り/書き込みプロパティがある場合、FxCopは文句を言います。
public List<Foo> Items { get; set; }
...クラスのユーザーはこれを行うことができるため:
myInstance.Items = new List<Foo>();
明らかに、クラスのユーザーがリストを完全に再割り当てすることは望ましくありません。したがって、FxCopは次のパターンを推奨します。
private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }
クラスのユーザーは、リストの新しいインスタンスでアイテムを上書きするのではなく、リストのアイテムの追加と削除のみができるようになりました。
Spring.NETはどのようにコレクションプロパティを実装しますか?彼らは本当に私の最初の例のように読み書きできますか?もしそうなら、そのようなパターンのユースケースを見るのは面白いでしょう、なぜならそれは正しいようには見えないからです。