2010-10-04 12 views
3

est-il autorisé à utiliser quelque chose comme ça dans le web: (ma demande est sur mvc de asp.net)dois-je utiliser une classe statique DbUtil pour le web, est-ce dangereux?

public static class DbUtil 
{ 
     public static int Insert(object o, string cs) 
     { 
      using (var conn = new SqlConnection(cs)) 
      using (var cmd = conn.CreateCommand()) 
      { 
       ... 

       conn.Open(); 
       return Convert.ToInt32(cmd.ExecuteScalar()); 
      } 
     } 
} 

utilisation:

public class Repository<T> : IRepository<T> 
{ 
     public virtual int Insert(T o) 
     { 
      return DbUtil.Insert(o, Cs); 
     } 
} 

et après l'injection du constructeur dans le service ou le contrôleur

public MyController(
     IRepository<Organization> organizationRepository) 
    { 
     this.organizationRepository = organizationRepository; 
    } 
+0

Cela dépend totalement de la façon dont vous appelez cette méthode. Pouvez-vous nous donner des exemples de son utilisation? Sinon, il est impossible de dire quelque chose d'utile à ce sujet. – Steven

+0

@Steven J'ai édité ma question – Omu

Répondre

2

il est tout à fait correct d'utiliser cette classe statique aussi longtemps qu'il est caché et enveloppé derrière le référentiel tel qu'il est dans votre cas . Cela permet un couplage plus faible entre la logique du contrôleur utilisant le référentiel et l'accès aux données. La méthode statique que vous avez montrée semble parfaitement reentrant ce qui le rend sûr pour les threads.

+0

ok, aussi mon IoC fait un singleton par défaut pour chaque Repository, est-ce correct sur le web? – Omu

+0

Oui, tant que vos référentiels sont réentrants et thread sûr. Mais soyez extrêmement prudent si vous utilisez une fabrique de contrôleurs personnalisée: les contrôleurs statiques peuvent tout détruire :-) D'autre part, je préfère garder mes dépôts non-singleton afin d'éviter que quelqu'un ne mette le code en erreur. Très franchement, le prix de l'instanciation d'objet est négligeable par rapport à l'utilisation. –

+0

Eh bien, vous avez vu mon dépôt, il est juste ado.net brut, pas d'appels à verrouiller ou quoi que ce soit, ce fil en toute sécurité? – Omu

1

Comme indiqué, votre méthode statique n'a aucun problème de concurrence, car elle ne fonctionne sur aucune donnée partagée et chaque appel instancie ses propres objets de connexion et de commande locaux.

Cependant, il ne semble pas que vous gagniez beaucoup à rendre la méthode statique. En général, vous préférerez les méthodes d'instance plutôt que les méthodes statiques, car les appels de méthodes statiques ne peuvent pas être modifiés lors des tests.