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 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.