Pimpant. IoC, Tests et Agatha

agatha-rrsl dapper inversion-of-control testing

Question

Sur un projet MVC 3, j'utilise EF4, IoC et Agatha-RRSL comme couche de service.

Heureusement, cette semaine, j'ai trouvé Dapper et je passe d'EF4 à Dapper!

Habituellement, j'injecte un dépôt générique dans mes gestionnaires de requêtes Agatha ...

Mais comment dois-je utiliser Dapper?

1) Dois-je injecter une IDbConnection dans le gestionnaire Agatha? Puis, à l'intérieur du gestionnaire, je l'utilise avec Dapper Query ou Dapper Execute? Est-ce que c'est testable? Et qu'en est-il de se moquer?

2) Dois-je créer un référentiel générique pour Dapper? Peut-être que le dépôt serait quelque chose comme:

public class Repository {

  private IDbConnection _connection;

  public Repository(IDbConnection connection) {
    _connection = connection;
  } // Repository

  public Int32 Execute(String sql, dynamic param = null) {
    return _connection.Execute(sql, param); 
  } // Execute

  // Query code   
}

Et la IDbConnection serait injectée ici.

Et le dépôt serait injecté dans les gestionnaires.

Pas sûr de savoir comment tester ça ...

3) Dois-je simplement placer tout mon code dans le gestionnaire?

using (SqlConnection connection = new SqlConnection(connectionString)) {
 connection.Execute(@"insert Roles(Name) values (@name)", new { name = "Role" }); 
}

Mais qu'en est-il des tests?

4) Je me suis rendu compte que Dapper utilise des méthodes statiques. Cela ne pose-t-il pas des problèmes de mémoire?

Désolé pour tant de questions ... J'essaie de bien faire les choses.

Merci, Miguel

Réponse populaire

Réponse tardive, mais je tiens à souligner que l'implémentation de votre référentiel est vraiment un "objet d'accès aux données". Les référentiels traitent des agrégats entiers, c.-à-d. un groupe de choses qui appartiennent ensemble. Idéalement, votre interface devrait uniquement accepter et renvoyer des objets du type racine agrégé (par exemple, un Repository<User> peut avoir des méthodes qui void Update(User user) {} ou IEnumerable<User> Find(...) {} ).

L'utilisation ou l'existence de tout mécanisme de persistance est un détail d'implémentation et n'appartient généralement pas à une interface de référentiel, et ne parlerait pas non plus de SQL.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi