2010-01-08 1 views
2

Dans une méthode d'essai (pour une cartographie Fluent NHibernate, bien que ce n'est pas vraiment pertinent) Je le code suivant enveloppé dans un tas de usings et essayer/blocs catch:Aide refactoring à une action <T> délégué

new PersistenceSpecification<Entry>(session) 
    .CheckProperty(e => e.Id, "1") 
    .VerifyTheMappings(); 

Je voudrais refactoriser ceci pour que je puisse passer à une méthode d'aide (où je place les blocs using et try/catch).

Mes exigences pour que cela fonctionne comme je veux qu'il sont

  1. session doit être fournie par l'une des déclarations en utilisant
  2. Entry doit être fourni en paramètre générique, donc je peux mappages de test de divers objets
  3. Il devrait être possible de remplacer .CheckProperty(e => e.Id, "1").VerifyTheMappings() par tout ce qui est appelé sur un PersistenceSpecification<T> lors de la définition de l'argument (dans la méthode de test).

En fait, je voudrais faire quelque chose comme ceci:

var testAction = new PersistenceSpecification<Entry>(session) 
         .CheckProperty(e => e.Id, "1") 
         .VerifyTheMappings(); 

HelpTestMethod(testAction) 

mais avec les exigences ci-dessus SATISIFIED.

Répondre

2

Qu'en est-il quelque chose comme:

Action<PersistenceSpecification<Entry>> testAction = pspec => pspec 
       .CheckProperty(e => e.Id, "1") 
       .VerifyTheMappings(); 

HelpTestMethod<Entry>(testAction); 

public void HelpTestMethod<T>(Action<PersistenceSpecification<T>> testAction) 
{ 
    using(var session = new SessionFactory().CreateSession(...)) 
    { 
     testAction(new PersistenceSpecification<T>(session)); 
    } 
} 
+0

Merci! J'ai dû modifier légèrement le code - par exemple, je ne pouvais pas assigner un lambda à une variable de type anonyme - mais maintenant ça fonctionne comme un charme! Je vais éditer votre post en quelques minutes pour refléter les changements que j'ai dû faire, donc le prochain gars qui trouve cela peut en profiter encore plus =) –