3 votes

Code ActiveRecord généré par SubSonic 3 avec des avertissements

Lors de l'utilisation de SubSonic 3 avec les modèles ActiveRecord T4, le code généré présente de nombreux avertissements concernant la conformité CLS, les éléments inutilisés et l'absence d'implémentation de GetHashCode().

Afin de les éviter, j'ai fait les modifications suivantes :

// Structs.tt
[CLSCompliant(false)]                                    // added
public class <#=tbl.CleanName#>Table: DatabaseTable
{ ...

// ActiveRecord.tt
[CLSCompliant(false)]                                    // added
public partial class <#=tbl.ClassName#>: IActiveRecord
{
    #region Built-in testing
    #pragma warning disable 0169                         // added
    static IList<<#=tbl.ClassName#>> TestItems;
    #pragma warning restore 0169                         // added
    ...

    public override Int32 GetHashCode()                  // added
    {
      return this.KeyValue().GetHashCode();
    }

    ...

Existe-t-il un meilleur moyen de se débarrasser des avertissements ? Ou une meilleure implémentation de GetHashCode() ?

2voto

Will Points 76760

Actuellement, le seul moyen de se débarrasser de ces avertissements est de mettre à jour vos modèles t4 et de soumettre un bug/réparation à Rob. Ou bien attendre que quelqu'un d'autre le fasse.

En ce qui concerne l'implémentation de GetHashCode, je ne pense pas que vous trouverez un bon moyen de le faire par le biais de modèles. La génération du code de hachage est très dépendante de l'état que contient votre objet. Et les gens avec beaucoup de lettres après leur nom travaillent longtemps et durement pour trouver des algorithmes de code de hachage qui sont rapides et renvoient des résultats avec de faibles chances de collision. Faire cela à partir d'un modèle qui peut générer une classe avec des millions de permutations différentes de l'état qu'elle peut contenir est un défi de taille à relever.

La meilleure chose que Rob aurait pu faire aurait été de fournir une implémentation par défaut qui appelle une méthode partielle, vérifie le résultat et le renvoie s'il est trouvé. Voici un exemple :

public partial class Foo
{
    public override int GetHashCode()
    {
        int? result = null;
        TryGetHashCode(ref result);
        if (result.HasValue)
            return result.Value;
        return new Random().Next();
    }

    partial void TryGetHashCode(ref int? result);
}

public partial class Foo
{
    partial void TryGetHashCode(ref int? result)
    {
        result = 5;
    }
}

Si vous compilez cet exemple sans l'implémentation de TryGetHashCode, le compilateur omet complètement l'appel à TryGetHashCode et vous allez de la déclaration de résultat pour vérifier s'il a une valeur, ce qui n'est jamais le cas, donc l'implémentation par défaut du code de hachage est retournée.

1voto

Bruce McLeod Points 1142

Je voulais aussi une solution rapide pour cela. La version que j'utilise génère GetHashCode pour les tables dont la clé primaire est un seul int.

Comme nos tables simples utilisent du texte comme clé primaire, cela n'a pas fonctionné. J'ai donc apporté la modification suivante au modèle près de la ligne 273 dans ActiveRecord.tt

<#      if(tbl.PK.SysType=="int"){#>

        public override int GetHashCode() {
            return this.<#=tbl.PK.CleanName #>;
        }
<#      }#>
<#      else{#>
        public override int GetHashCode() {
            throw new NotImplementedException();
        }
<#      }#>

De cette façon, GetHashCode est généré pour toutes les tables et arrête les avertissements, mais lèvera une exception si elle est appelée (ce que nous ne faisons pas).

Nous l'utilisons pour une application de test, pas pour un site web ou autre chose du genre, et cette approche peut ne pas être valable pour de nombreuses situations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X