2010-04-30 3 views
3

J'ai trois méthodes:Comment combiner des appels de méthode similaires dans un modèle de délégué?

public void Save<T>(T entity) 
{ 
    using (new Transaction()) 
    { 
     Session.Save(entity); 
    } 
} 

public void Create<T>(T entity) 
{ 
    using (new Transaction()) 
    { 
     Session.Create(entity); 
    } 
} 

public void Delete<T>(T entity) 
{ 
    using (new Transaction()) 
    { 
     Session.Delete(entity); 
    } 
} 

Comme vous pouvez le voir, la seule chose qui diffère est l'appel de méthode à l'intérieur du bloc using. Comment puis-je réécrire ce donc c'est quelque chose comme ceci:

public void Save<T>(T entity) 
{ 
    TransactionWrapper(Session.Save(entity)); 
} 

public void Create<T>(T entity) 
{ 
    TransactionWrapper(Session.Create(entity)); 
} 

public void Save<T>(T entity) 
{ 
    TransactionWrapper(Session.Save(entity)); 
} 

En d'autres termes, je passe un appel de méthode en tant que paramètre, et la méthode TransactionWrapper enveloppe une transaction autour de l'appel de méthode.

Répondre

4

Vous pouvez passer un Action<T> à une méthode pour spécifier une action à exécuter:

private void ExecuteInTransaction<T>(Action<T> action, T entity) 
{ 
    using (new Transaction()) 
    { 
     action(entity); 
    } 
} 

public void Save<T>(T entity) 
{ 
    ExecuteInTransaction(Session.Save, entity); 
} 

Mais l'OMI ce n'est pas une amélioration digne de votre code d'origine si votre ExecuteInTransaction méthode n'est pas plus complexe .

+0

Merci, cela fonctionne très bien. Je voulais envelopper les appels de méthode dans une méthode de transaction afin que je puisse facilement activer/désactiver les transactions sur les trois méthodes en un seul endroit. –

Questions connexes