-
Notifications
You must be signed in to change notification settings - Fork 1
Attributed Configuration es
Tal como se enunció en la página de inicio, una manera de personalizar la comparación de objetos por propiedad es utilizar atributos especiales en los tipos de datos y sus propiedades.
IMPORTANTE: Este tipo de configuración es global. Esto quiere decir que la configuración hecha a través de atributos es leída y almacenada globalmente dentro del almacenamiento de datos del escáner. Objetos comparadores de objetos creados después del registro de un tipo de datos (escaneo) usarán los valores configurados a través de este método. La configuración hecha a través de este método puede ser sobreseída globalmente utilizando configuración de tipo de interfaz fluida, y localmente utilizando configuración de comparador de interfaz fluida.
Esta biblioteca define tres atributos: IgnoreForComparisonAttribute, PropertyMapAttribute y ScanForPropertyComparisonAttribute.
Los atributos deben estar en su lugar antes de que un tipo de datos sea registrado (escaneado), y entran a funcionar cuando el tipo de datos se ha registrado.
Para registrar un tipo puede invocarse cualquiera de los métodos Scanner.RegisterType(). Ejecute una llamadas por cada tipo a registrar, y hágalo una vez por ciclo de vida de la aplicación. Por ejemplo, la llamada puede estar en el método Main() de una aplicación de consola, o en el método OnStart() de un servicio de Windows.
public static void Main(string[] args)
{
//Método genérico.
Scanner.RegisterType<PurchaseOrder>();
//Método no genérico. Son la misma cosa.
Scanner.RegisterType(typeof(PurchaseOrderVM));
}El atributo IgnoreForComparisonAttribute se utiliza para ignorar una propiedad cuando los objetos del tipo de datos son comparados contra una cantidad o lista indefinida de tipos, o cuando se comparan contra objetos del mismo tipo, o ambos.
Es muy fácil de usar y provee tres posibles escenarios vía tres posibles valores. El siguiente ejemplo muestra el atributo usado en todos los posibles escenarios.
public class PurchaseOrder
{
//Ignorar la propiedad cuadno las órdenes de compra sean comparadas contra objetos de tipos
//diferentes. Es lo mismo que [IgnoreForComparison(IgnorePropertyOptions.IgnoreForOthers)].
[IgnoreForComparison]
public OrderStatus Status { get; set; }
//Ignorar la propiedad cuando las órdenes de compra se comparan contra otras órdenes de compra.
[IgnoreForComparison(IgnorePropertyOptions.IgnoreForSelf)]
public DateTime? ModifiedOn { get; set; }
//Ignorar la propiedad cuando las órdenes de compra se comparan contra cualquier objeto.
[IgnoreForComparison(IgnorePropertyOptions.IgnoreForAll)]
public byte[] RowVersion { get; set; }
}El atributo PropertyMapAttribute se utiliza ya sea para ignorar una propiedad cuando un objeto del tipo de datos se compara contra otro de un tipo de datos específico, o mapear una propiedad a otra en el tipo de datos blanco con un nombre diferente. También es posible especificar una propiedad con el mismo nombre si se requerirá de coerción a texto y se necesita especificar textos de formato. Este tema no se discute aquí, pero puede leer todo acerca de esto en la página de Coerción a Texto del wiki.
Una vez más, es muy fácil de usar y cuando se mapea a una propiedad, puede especificarse coerción a texto. Debido a que el mapa de propiedad está ligado a un tipo de datos blanco específico, es posible agregar más mapas de propiedades, uno por cada tipo de datos blanco.
public class PurchaseOrder
{
//Ignorar la propiedad cuando las órdenes de compra se comparan contra los modelos-vista.
[PropertyMap(typeof(PurchaseOrderVM), PropertyMapOperation.IgnoreProperty)]
public long Id { get; set; }
//Mapear la propiedad a una propiedad de nombre diferente en la clase PurchaseOrderVM.
//Ignorar la propiedad cuando se compara contra objetos de la clase CalcPurchaseOrder.
[PropertyMap(typeof(PurchaseOrderVM), PropertyMapOperation.MapToProperty, nameof(PurchaseOrderVM.POTotal))]
[PropertyMap(typeof(CalcPurchaseOrder), PropertyMapOperation.IgnoreProperty]
public decimal Total { get; set; }
//Coercer la hora de envío a texto de forma que sólo se compare la parte de fecha.
[PropertyMap(typeof(PurchaseOrder), PropertyMapOperation.MapToProperty, nameof(SubmissionDate),
ForceStringValue = true, FormatString = "yyyyMMdd", TargetFormatString = "yyyyMMdd")]
public DateTime SubmissionDate { get; set; }
}El último atributo a discutir es el atributo ScanForPropertyComparisonAttribute. Su función es eliminar múltiples llamadas a los métodos Scanner.RegisterType(). Aplique el atributo ScanForPropertyComparisonAttribute a cada tipo de datos que se verá involucrado en la comparación de objetos por propiedad. Luego, en lugar de ejecutar el método RegisterType() múltiples veces, simplemente ejecute el método ScanAssembly() una sola vez. Esto registrará todos los tipos de dastos marcados con el atributo.
//Hacer esto para cada tipo de datos que se usará en comparación de objetos.
[ScanForPropertyComparison]
public class PurchaseOrder { ... }public static void Main(string[] args)
{
//La clase PurchaseOrder se usa aquí meramente como un ancla al ensamblado que contiene el tipo,
//asumiendo que todos los otros tipos de datos a escanear están en el mismo ensamblado
Scanner.ScanAssembly(typeof(PurchaseOrder).Assembly);
//Si el proyecto es suficientemente simple y todos los tipos de datos a escanear están en el
//mismo proyecto (ensamblado), entonces puede hacer esto:
Scanner.ScanAssembly(Assembly.GetExecutingAssembly());
}