Si genero mis entidades a través de Entity Framework Database First , y quiero usar una función como esa:
AuditManager.DefaultConfiguration.Exclude<T>();
Teniendo en cuenta que el número de veces que quiero llamar debería ser igual al número de entidades
ex:
AuditManager.DefaultConfiguration.Exclude<Employee>();
AuditManager.DefaultConfiguration.Exclude<Department>();
AuditManager.DefaultConfiguration.Exclude<Room>();
Ahora, ¿cómo pasar por el número seleccionado de entidades y pasar cada una a la función Exclude
?
La solución obvia sería llamar al método para cada tipo de entidad que desee ocultar. Me gusta esto:
AuditManager.DefaultConfiguration.Exclude<Employee>();
AuditManager.DefaultConfiguration.Exclude<Department>();
AuditManager.DefaultConfiguration.Exclude<Room>();
Puede agregar sentencias condicionales ( if
las hay) alrededor de ellas para hacerlo dinámicamente.
Sin embargo, si desea una solución completamente flexible, donde llama al método Exclude
basado en metadatos, necesita algo más. Algo como esto:
var types = new[] { typeof(Employee), typeof(Department), typeof(Room) };
var instance = AuditManager.DefaultConfiguration;
var openGenericMethod = instance.GetType().GetMethod("Exclude");
foreach (var @type in types)
{
var closedGenericMethod = openGenericMethod.MakeGenericMethod(@type);
closedGenericMethod.Invoke(instance, null);
}
Esto supone que el método Exclude<T>
es un método de instancia en cualquier instancia que DefaultConfiguration
apunte.
Una alternativa al bucle a través de sus tipos de entidad es hacer que las entidades que no desea auditar implementen la misma interfaz y excluirla. Por ejemplo:
public interface IExcludeFromAudit
{ }
Y tus entidades:
public class Order : IExcludeFromAudit
{
//snip
}
Y ahora solo excluye la interfaz:
AuditManager.DefaultConfiguration.Exclude<IExcludeFromAudit>();
El beneficio de esto es que ahora es fácil controlar cuáles están excluidos.