2008-10-15 80 views
2

FxCop擁有CollectionPropertiesShouldBeReadOnly rule,如果您的課程具有客戶端可以設置的某種集合屬性,則會投訴。相反,它建議使屬性爲只讀並提供Clear()方法和Add()或AddRange()方法來更改集合的內容。FxCop的CollectionPropertiesShouldBeReadOnly規則是否與Spring框架不兼容?

我同意使用更乾淨和更受控制的接口,但我努力使該接口與Spring框架一起工作。如果我想用一組協作者來配置一個對象,我必須公開一些收集屬性以將協作者注入。我已經瀏覽了the Spring documentation,我看不出有什麼辦法可以告訴Spring調用AddRange()方法,我錯過了什麼嗎?

現在,我將排除警告,並提示它是Spring配置所必需的。

更新:由於在過去兩個月中我沒有收到任何小字,所以我在FxCop forum上發佈了相同的問題。

回答

3

如果集合屬性只有一個getter公開,我們將假定您列出的FxCop建議模式被使用並添加到集合中。第一種模式也被支持。

對於泛型集合,這隻在暴露的屬性是IList類型時才起作用。我們有一個JIRA issue下一個版本來解決這個問題。順便說一句,這是基類庫中的一種非常常見的模式(正如你可能知道的......),這是我們在.NET 1.1中首次遇到需要支持這種風格的地方(它不受上面列出的限制) 。

乾杯, 馬克

2

問題與您想象的一樣糟糕嗎?我的理解是,如果你有一個讀的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如何實現其集合屬性?他們真的是像我的第一個例子一樣讀/寫嗎?如果是這樣,看到他們的這種模式的用例會很有趣,因爲它看起來不正確。

+0

Spring是一個依賴注入框架,所以它的呼喚myInstance.Items = ...在創建對象的時候。這感覺很奇怪,但我認爲設計用於依賴注入/反轉控制框架的類需要比平常更加被動。 – 2008-12-29 21:14:40