miércoles, 25 de febrero de 2015

CSharp Reflection


Buscando una solución para crear un esquema  de consumo de clases dinámico, me encontré con Reflection de C#.

Descripción del problema:
Tengo a cargo un desarrollo que consiste en aplicar correcciones a varios clientes de la empresa ABC que no cumplen con ciertas reglas de negocio.

Datos:
Al rededor de 60 reglas de negocio que no se cumplen.
Al rededor de 8000 clientes que no cumplen con las reglas de negocio.
Existen 45 reglas de negocio que pueden ser corregidas automáticamente.

Alcance:
El desarrollo parte desde el envío de los clientes para que dinámicamente se les apliquen las correcciones, es decir, cada reglas de negocio no cumplida, entrega al proceso que he denominado CORRECTOR un listado de clientes y este entrega una notificación con una lista de clientes corregidos por el proceso automático y otra lista de clientes para ser analizados por el usuario experto del negocio (donde no se pudo automatizar el proceso).

Solución:
1.- Cada CORRECTOR de regla de negocio va en un clase diferente (puede existir una clase abstracta que encierre los principales métodos).

  public interface ICorrector
    {
        CorrectorResult Corrector(string customerId);
    }

    public class CorrectorResult
    {
        public CorrectorCode Code { get; set; }
        public String Message { get; set; }
        public String ClassName { get; set; }
        public CorrectorResult(string className)
        {
            this.ClassName = className;
        }
    }

    public enum CorrectorCode
    {
        Ok,
        Error,
        NotExist
    }

   public class Rule0001Corrector : ICorrector
    {
        public CorrectorResult Corrector(string customerId)
        {
            var result = new CorrectorResult("Rule0001Corrector");
         
            //TODO: Implementation
         
            result.Code = CorrectorCode.Ok;
            result.Message = "Regla de Preventa 0001 aplicada exitosamente";

            return result;
        }
    }

 public class Rule0002Corrector : ICorrector
    {
        public CorrectorResult Corrector(string customerId)
        {
            var result = new CorrectorResult("Rule0002Corrector");


            result.Code = CorrectorCode.Ok;
            result.Message = "Regla de Preventa 0002 aplicada exitosamente";

            return result;
        }
    }


2.- El CORRECTOR Reflection que invoca cada clase de regla de negocio.

    public class RuleCorrectorReflection
    {
        private ICorrector rule;
        public CorrectorResult Result { get; set; }
        public RuleCorrectorReflection(string ruleClassName, string customerId)
        {

            //Obtiene Type del corrector de la regla
            Type correctorType = Type.GetType(ruleClassName);
         
            //Instancia el corrector de la regla
            var correctorInstance = Activator.CreateInstance(correctorType);
         
            //Setea en la interface para darle el comportamiento
            rule = (ICorrector)correctorInstance;

            //Obtiene el resultado
            Result = rule.Corrector(customerId);
        }

    }






No hay comentarios:

Publicar un comentario