2010-10-04 37 views
3

Le projet sur lequel je travaille actuellement utilise un objet IDisposable dans chaque méthode d'une classe. Il a commencé à être fastidieux en re-tapant le bloc using au début de chaque méthode, et se demandait s'il y avait un moyen de spécifier une variable jetable pour une utilisation dans chaque méthode de la classe?C# Objet IDisposable pour toute la classe

public static class ResourceItemRepository 
{ 
    public static ResourceItem GetById(int id) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
    public static List<ResourceItem> GetInCateogry(int catId) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
    public static ResourceItem.Type GetType(int id) 
    { 
     using (var db = DataContextFactory.Create<TestDataContext>()) 
     { 
      // Code goes here... 
     } 
    } 
} 

Répondre

13

Non, il n'y a rien de particulièrement adapté à cela. Vous pourrait écrire:

public static ResourceItem GetById(int id) 
{ 
    WithDataContext(db => 
    { 
     // Code goes here... 
    }); 
} 

// Other methods here, all using WithDataContext 

// Now the only method with a using statement: 
private static T WithDataContext<T>(Func<TestDataContext, T> function) 
{ 
    using (var db = DataContextFactory.Create<TestDataContext>()) 
    { 
     return function(db); 
    } 
} 

Je ne suis pas sûr que ce serait particulièrement bénéfique si.

(Notez que j'ai dû changer de Action<TestDataContext> dans ma version originale Func<TestDataContext, T> que vous voulez être en mesure de retourner les valeurs de vos méthodes.)

+0

Je l'ai appris quelque chose votre réponse - j'ai essayé de comprendre les expressions lambda et de les utiliser dans le monde réel. Merci. – Greg

+0

@Downvoter: Vous voulez donner une raison? –

+0

Belle solution ... Seule la question serait de savoir comment rendre plus facile le test unitaire ... J'ai utilisé IOC pour injecter l'usine de contexte, donc je suppose que j'ai répondu à ma propre question ... –

3

Franchement, je garderais le code bavard, mais en utilisant un extrait au lieu de taper tout à chaque fois. soit créer votre propre extrait avec un special tool ou utiliser des outils de remplacement de texte comme Texter

0

Peut-être simple refactoring est le meilleur que vous pouvez faire sans recourir à quelque chose comme PostSharp:

public static class ResourceItemRepository { 
    public static ResourceItem GetById(int id) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    public static List<ResourceItem> GetInCateogry(int catId) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    public static ResourceItem.Type GetType(int id) { 
    using (var db = CreateDataContext()) { 
     // Code goes here... 
    } 
    } 
    private static TestDataContext CreateDataContext() { 
    return DataContextFactory.Create<TestDataContext>(); 
    } 
}