Dapper. IoC, Testen und Agatha

agatha-rrsl dapper inversion-of-control testing

Frage

In einem MVC 3 Projekt verwende ich EF4, IoC und Agatha-RRSL als meine Serviceebene.

Glücklicherweise fand ich diese Woche Dapper und ich ziehe von EF4 zu Dapper!

Normalerweise injiziere ich ein generisches Repository in meine Agatha Request Handler ...

Aber wie soll ich Dapper benutzen?

1) Sollte ich eine IDbConnection in den Agatha Handler injizieren? Dann benutze ich es innerhalb der Handler mit Dapper Query oder Dapper Execute? Ist das testbar? Und was ist mit Spott?

2) Soll ich ein generisches Repository für Dapper erstellen? Vielleicht wäre das Repository so etwas wie:

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   
}

Und die IDbConnection würde hier injiziert werden.

Und das Repository würde in die Handler injiziert werden.

Nicht sicher, wie man das testet ...

3) Sollte ich nur meinen Code in den Handler legen?

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

Aber was ist mit Testen?

4) Ich habe erkannt, dass Dapper statische Methoden verwendet. Bringt das nicht einige Speicherprobleme?

Sorry für so viele Fragen ... Ich versuche das richtig zu machen.

Danke, Miguel

Beliebte Antwort

Späte Antwort, aber ich möchte darauf hinweisen, dass Ihre Repository-Implementierung wirklich ein "Datenzugriffsobjekt" ist. Repositories befassen sich mit ganzen Aggregaten, d. eine Gruppe von Dingen, die zusammengehören. Idealerweise sollte Ihre Schnittstelle nur Objekte des aggregierten IEnumerable<User> Find(...) {} akzeptieren und zurückgeben (zum Beispiel kann ein Repository<User> Methoden void Update(User user) {} oder IEnumerable<User> Find(...) {} ) haben.

Die Verwendung oder Existenz eines Persistenzmechanismus ist ein Implementierungsdetail und würde normalerweise nicht in eine Repository-Schnittstelle gehören, noch würde es SQL sprechen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow