Tenemos muchos objetos de valor inmutables en nuestro modelo de dominio, un ejemplo de esto es una posición, definida por una latitud, longitud & de altura.¿Cómo puedo editar objetos inmutables en WPF sin duplicar el código?
/// <remarks>When I grow up I want to be an F# record.</remarks>
public class Position
{
public double Latitude
{
get;
private set;
}
// snip
public Position(double latitude, double longitude, double height)
{
Latitude = latitude;
// snip
}
}
La manera obvia de permitir la edición de una posición es la construcción de un modelo de vista que tiene getters y emisores, así como un método toPosition() para extraer la instancia posición inmutable validado. Si bien esta solución estaría bien, daría como resultado una gran cantidad de código duplicado, especialmente XAML.
Los objetos de valor en cuestión consisten en entre tres y cinco propiedades que son por lo general alguna variante de X, Y, Z & un poco de materia auxiliar. Dado esto, consideré la creación de tres ViewModels para manejar las diversas posibilidades, donde cada ViewModel necesitaría exponer propiedades para el valor de cada propiedad, así como una descripción para mostrar para cada etiqueta (por ejemplo, "Latitude").
Yendo más lejos, parece que podría simplificarlo a un modelo de vista general que puede tratar con N propiedades y conectar todo usando reflexión. Algo así como una grilla de propiedad, pero para objetos inmutables. Un problema con una cuadrícula de propiedad es que quiero ser capaz de cambiar el aspecto para que pueda tener etiquetas y cuadros de texto, tales como:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
o ponerlo en una cuadrícula de datos tales como:
Latitude | Longitude | Height
32 115 12
Así que mi pregunta es:
¿Puede pensar en una forma elegante de resolver este problema? ¿Hay bibliotecas que hacen esto o artículos sobre algo similar?
estoy buscando principalmente:
- duplicación de código a ser minimizado
- fácil añadir nuevos tipos de objetos de valor
- posible extender con algún tipo de validación
Esta es una buena solución, prefiero a Paul ya que hay menos repetitivo. Por supuesto, también podría usar la reflexión en su solución para reducir la sobrecarga del programador de las propiedades de asignación al diccionario. En realidad, no hay una respuesta aceptada porque resolví el problema de otra manera y no había notado la respuesta de Paul más o menos 6 meses después de plantear la pregunta. Si tuviera que ofrecer un fragmento de código funcional que la gente pudiera usar, lo marcaré como la respuesta aceptada. –