¿Es la regla CollectionPropertiesShouldBeReadOnly de FxCop incompatible con el framework spring?

StackOverflow https://stackoverflow.com/questions/206746

  •  03-07-2019
  •  | 
  •  

Pregunta

FxCop tiene la CollectionPropertiesShouldBeReadOnly rule que se queja si su clase tiene algún tipo de la propiedad de colección que los clientes pueden establecer. En su lugar, sugiere que la propiedad sea de solo lectura y que proporcione un método Clear () y métodos Add () o AddRange () para cambiar el contenido de la colección.

Estoy de acuerdo en que hace una interfaz más limpia y más controlada, pero estoy luchando para que esa interfaz funcione con el marco de Spring. Si quiero configurar un objeto con una colección de colaboradores, tengo que exponer alguna propiedad de colección para inyectar a los colaboradores. He revisado la documentación de Spring , y puedo No veo ninguna forma de decirle a Spring que llame al método AddRange (), ¿me estoy perdiendo algo?

Por ahora, excluiré la advertencia con una nota que es necesaria para la configuración de Spring.

Actualización: debido a que no obtuve ningún bocado aquí en los últimos dos meses, publiqué la misma pregunta en FxCop forum .

¿Fue útil?

Solución

Si la propiedad de la colección solo tiene un getter expuesto, asumiremos que los patrones recomendados por FxCop que usted usa en la lista se agregarán a la colección. El primer patrón también es compatible.

Para colecciones genéricas esto solo funciona si la propiedad expuesta es del tipo IList. Tenemos un problema de JIRA para la próxima versión para solucionar este problema. Por cierto, este es un patrón muy común en las bibliotecas de clase base (como probablemente sepa ...) que es donde nos encontramos por primera vez con la necesidad de admitir este estilo en .NET 1.1 (que no se ve afectado por la limitación mencionada anteriormente) .

Saludos, Marca

Otros consejos

¿El problema es tan malo como crees? Según tengo entendido, FxCop se quejará si tiene una propiedad de lectura / escritura como esta:

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

... porque los usuarios de su clase podrían hacer esto:

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

Obviamente, no quieres que los usuarios de tu clase vuelvan a asignar la lista por completo. Por lo tanto, FxCop recomienda este patrón:

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

Por lo tanto, ahora los usuarios de su clase solo pueden agregar y eliminar elementos de su lista, en lugar de sobrescribirlos con una nueva instancia de la lista.

¿Cómo implementa Spring.NET sus propiedades de colección? ¿Son realmente leer / escribir como mi primer ejemplo? Si es así, sería interesante ver sus casos de uso para tal patrón, porque no parece correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top