Estoy creando una aplicación que hace uso intensivo de Enums para los datos personalizados. Esencialmente, un objeto se almacena en la base de datos con cerca de 28 de atributos independientes. Cada atributo es un campo de caracteres que se traduce desde el SQL directamente a un Enum.

Por desgracia, creo que además la necesidad de traducir estos valores en dos diferentes legible valores. Uno de una leyenda en una tabla de datos, y uno de una clase CSS para el estilo de una imagen en la aplicación web front-end.

Para ello, he creado dos atributos personalizados y las aplicó a la Enum cuando sea necesario. Por ejemplo:

Atributo Personalizado De La Interfaz De

public interface IAttribute<T>
{
    T Value { get; }
}

Ejemplo De Atributo Personalizado

public sealed class AbbreviationAttribute: Attribute, IAttribute<string>
{
    private readonly string value;

    public AbbreviationAttribute(string value)
    {
        this.value = value;
    }

    public string Value
    {
        get { return this.value; }
    }
}

Método para Recuperar Atributo Personalizado de Enum

public static R GetAttributeValue<T, R>(IConvertible @enum)
{
    R attributeValue = default(R);

    if (@enum != null)
    {
        FieldInfo fi = @enum.GetType().GetField(@enum.ToString());

        if (fi != null)
        {
            T[] attributes = fi.GetCustomAttributes(typeof(T), false) as T[];

            if (attributes != null && attributes.Length > 0)
            {
                IAttribute<R> attribute = attributes[0] as IAttribute<R>;

                if (attribute != null)
                {
                    attributeValue = attribute.Value;
                }
            }
        }
    }

    return attributeValue;
}

Ejemplo Enum El Uso De Este Patrón

public enum Download
{
    [Abbreviation("check")]
    [Description("Certified")]
    C = 1,

    [Abbreviation("no-formal")]
    [Description("No formal certification")]
    NF = 2,

    [Abbreviation("cert-prob")]
    [Description("Certified with potential problems")]
    CP = 3
}

Tanto Abbreviation y Description son atributos personalizados que implementar IAttribute<T>. Mi Enum tiene 11 valores posibles, y como he mencionado antes de que sea utilizado en 28 de propiedades separadas en el objeto personalizado. El uso de atributos personalizados parecía la mejor manera de mapa esta información de ida y vuelta.

Ahora por la pregunta, es esta la mejor manera de lograr esto? Me tienda la Enum valor («C», «NF», o «CP» en el fragmento de arriba) en la base de datos, pero necesito los valores de la Abreviatura y la Descripción en mi código. Además, dudo que este sea el final de la serie de atributos personalizados que voy a necesitar.

Antes de seguir adelante con este patrón … es la manera correcta de hacer las cosas? Prefiero solucionar posibles problemas con este enfoque que tiene para rastrear y refactorizar más tarde.

  • Yo podía ver a algunos de los problemas de localización, tal y como está
  • Buen punto. Yo probablemente podría modificar IAttribute para apoyar un gettext estilo de la localización de la instalación, sin embargo. Yo estoy más preocupado acerca de la escalabilidad, el rendimiento y las mejores prácticas de las que yo podría no ser consciente.
  • GetAttributeValue no es un método de extensión contraria a la anterior descripción de texto.
  • Yo estaría inclinado a promover la enumeración de una clase y poner las 11 posibles valores en una tabla con «Abreviatura» y «Descripción» de las columnas.
  • Mi error. Originalmente fue un método de extensión 🙂
  • Para aquellos que están preocupados por la recolocación de la aplicación, es una app web que es reasignado ya dos veces por semana por la rutina de las actualizaciones. No estoy tan preocupado por que como soy potencialmente arrastrando malo(?) los procesos de desarrollo a lo largo del paseo.

InformationsquelleAutor EAMann | 2012-03-07

3 Comentarios

  1. 15

    Este mismo método es el que yo uso. El único inconveniente es la serialización. Los atributos personalizados valores no se serializan.

    Me gusta el atributo personalizado sobre el método método de base de datos porque vincula los datos de atributo derecho a la enumeración en lugar de tener que utilizar una tabla de búsqueda o de clase, etc.

    • El otro inconveniente es que tienes que volver a implementar completamente la aplicación si una descripción nunca cambia por tanto como un personaje
    • verdadero. mitigado por las recientes opciones de implementación (aka ClickOnce), pero estás en lo correcto. La mayoría de mis aplicaciones tienden a ser web o cosas con largos períodos de tiempo entre la implementación de los ciclos de la de muchas otras cosas van a cambiar, por lo que actualizar un par de descripciones no es la gran cosa.
  2. 2

    Probablemente me construya una tabla hash y un tipo especial de algo como esto. Puede que ya han descartado la idea de que por alguna razón u otra, pero aquí es lo que yo haría no saber los detalles de su aplicación.

    class SpecialType {
      //include the fields and all attributes that you need to reference, ToString method for debugging, and any serialization you need
      public string foo { get; set; }
      public string bar { get; set; }
      public ToString() { return "SpecialType with foo '" + foo + "' and bar '" + bar + "'"; }
    }
    
    Dictionary<int, SpecialType> myDict = new Dictionary<int, SpecialType> {
       { 1, new SpecialType { foo = "XA1B2", bar = "XC3D4" } },
       { 2, new SpecialType { foo = "ZA1B2", bar = "ZC3D4" } },
       { 3, new SpecialType { foo = "YA1B2", bar = "YC3D4" } },
    }

    Entonces yo podría fácilmente mantener enteros en mis otras clases para ahorrar memoria, averiguar si un determinado valor fue válido por la comprobación de la existencia de las Claves del Diccionario, all that jazz. Probablemente sería mucho más fácil de hacer de enlace de datos si está al final va a utilizar WPF o de lectura/escritura en el disco, también.

  3. 1

    Se puede modificar la base de datos? Creo que la mejor opción sería hacer una tabla (o tablas) a la casa de los posibles valores de las enumeraciones y clave externa de los principales objetos a través de ella (en lugar de usar char códigos – esto hace tirando de ella en más fácil y normaliza su DB). Le dan a la mesa un Abbreviation y Description columna, a continuación, tire de los en y hacer referencia a ellos por su clave, y se caché si las búsquedas son lentos.

    Una cosa que es peligrosa acerca de los atributos es que si cualquiera de esas cadenas vez tiene que cambiar, es una completa volver a implementar la aplicación. Si los valores de base de datos, puede cambiar con una simple UPDATE.

Dejar respuesta

Please enter your comment!
Please enter your name here