2008-10-15 2 views
2

FxCop에 클라이언트가 설정할 수있는 일종의 컬렉션 속성이있는 경우 불평하는 CollectionPropertiesShouldBeReadOnly rule이 있습니다. 대신 속성을 읽기 전용으로 설정하고 컬렉션 내용을 변경하기위한 Clear() 메서드 및 Add() 또는 AddRange() 메서드를 제공하는 것이 좋습니다.FxCop의 CollectionPropertiesShouldBeReadOnly 규칙이 스프링 프레임 워크와 호환되지 않습니까?

더 깨끗하고 제어 된 인터페이스를 만드는 데 동의하지만 Spring 프레임 워크와 작동하도록 고심하고 있습니다. 공동 작업자 콜렉션으로 오브젝트를 구성하려는 경우 공동 작업자를 삽입 할 콜렉션 특성을 공개해야합니다. the Spring documentation을 살펴 봤는데 Spring에 AddRange() 메서드를 호출하도록 알릴 방법이 보이지 않습니다. 뭔가 빠졌습니까?

지금은 스프링 구성에 필요하다는 메모와 함께 경고를 제외하겠습니다.

업데이트 : 지난 두 달 동안 아무런 조언도받지 못했기 때문에 FxCop forum에 같은 질문을 게시했습니다.

답변

3

컬렉션 속성에 게터가 노출되어있는 경우 목록에있는 FxCop 권장 패턴을 사용하고 컬렉션에 추가한다고 가정합니다. 첫 번째 패턴도 지원됩니다.

일반 컬렉션의 경우 노출 된 속성이 IList 유형 인 경우에만 작동합니다. 다음 릴리스에서이 문제를 해결하기 위해 JIRA issue이 있습니다. BTW, 이것은 기본 클래스 라이브러리에서 매우 일반적으로 사용되는 패턴입니다 (위에서 알 수 있듯이) ... .NET 1.1에서이 스타일을 지원해야 할 필요성이 처음 발생한 곳입니다 (위에 나열된 제한을 겪지 않음) .

건배, 마크

2

당신이 생각하는 것만 큼 나쁜 문제입니까? 확실히 당신을

myInstance.Items = new List<Foo>(); 

: 클래스의 사용자는 다음이 작업을 수행 할 수있을 것입니다 때문에 ...

public List<Foo> Items { get; set; } 

을 : 나의 이해는합니다 FxCop 당신이 읽기이있는 경우/불평과 같은 속성을 쓰는 것입니다 클래스 사용자가 목록을 완전히 다시 할당하지 못하도록하십시오. 의 FxCop 따라서이 패턴을 권장합니다

private List<Foo> _items = new List<Foo>(); 
public List<Foo> Items { get { return _items; } } 

이제 클래스의 사용자는 추가 오히려 목록의 새로운 인스턴스로 덮어보다, 목록에서 항목을 제거 할 수 있습니다.

Spring.NET은 컬렉션 속성을 어떻게 구현합니까? 첫 번째 예처럼 읽기/쓰기가 가능한가요? 그렇다면 올바른 패턴이 아니기 때문에 이러한 패턴에 대한 사용 사례를 보는 것이 흥미로울 것입니다.

+0

스프링 의존성 주입기구이므로 객체 생성시 myInstance.Items = ... 전화입니다. 이상하게 느껴지 나, 의존성 주입/제어 반전 프레임 워크 내에서 사용하도록 설계된 클래스는 평소보다 더 수동적이어야한다고 생각합니다. –

+0

불행히도 특정 FxCop 규칙이 실제로 Spring.NET과 "호환되지 않는"것처럼 들릴 수 있습니다. –