Repository Design Pattern mit Dapper

Dies ist vielleicht eher eine Frage für code-review statt stack-überlauf.

Bin ich mit Dapper für ein MicroORM zum abrufen und Speichern von Daten in SQL Server 2014. Ich habe DTO-Klassen in ein DTO Proj vertreten, dass die abgerufenen Daten aus der DB oder in der DB gespeichert.

Ich bin mit dem Repository-Muster so an meinen Service-layer wird ein repository benötigt, bin ich mit dem Konstruktor DI, Spritzen, Abhängigkeit und rufen Sie dann die Methode auf das Repository, um die Arbeit zu tun.

also sagen wir ich habe 2 Dienste genannt CustomerService und CarService.

Dann habe ich 2 Repositories ein CustomerRepository und ein CarRepository.

Habe ich ein interface definiert alle Methoden, die in jedem Repository, und dann die konkreten Implementierungen.

Einer Beispiel-Methode ist unten dargestellt (ruft eine Gespeicherte Prozedur zu tun, die DB EINFÜGEN (Hinweis: der eigentliche string-variable für die gespeicherte Prozedur definiert ist als private string an der Spitze der Klasse):

    public void SaveCustomer(CustomerDTO custDTO)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            db.Execute(saveCustSp, custDTO, commandType: CommandType.StoredProcedure);
        }
    }

Dies alles funktioniert gut, aber ich finde mich wiederholen den using-block in jede Methode, die in jedem repository. Ich habe zwei richtige Fragen, die nachfolgend umrissen werden.

Gibt es eine bessere Methode, die ich verwenden könnte vielleicht irgendwie mit einem BaseRepository Klasse, die jedes andere Repository erbt und die Basis zur Umsetzung der Instanzierung des DB-Verbindung?

Wäre das noch ok, arbeiten für mehrere gleichzeitige Benutzer auf dem system?

****UPDATE****

Basierend auf Silas Antwort, die ich erstellt haben, den folgenden

public interface IBaseRepository
{
    void Execute(Action<IDbConnection> query);
}

public class BaseRepository: IBaseRepository
{
        public void Execute(Action<IDbConnection> query)
        {
            using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
            {
                query.Invoke(db);
            }
        }
}

Jedoch in meinen repositories, ich habe andere Methoden wie zum Beispiel die folgenden:

    public bool IsOnlyCarInStock(int carId, int year)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            var car = db.ExecuteScalar<int>(anotherStoredSp, new { CarID = carId, Year = year },
                                commandType: CommandType.StoredProcedure);

            return car > 0 ? true : false;
        }
    }

und

    public IEnumerable<EmployeeDTO> GetEmployeeDetails(int employeeId)
    {
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDB"].ConnectionString))
        {
            return db.Query<EmployeeDTO>(anotherSp, new { EmployeeID = employeeId },
                                commandType: CommandType.StoredProcedure);
        }
    }

Was ist der richtige Weg, um diese zu meinem Base-repository mit Hilfe von Generischen Typ T, so konnte ich wieder jede Art von DTO oder C# Native Art

Dies ist der Weg, es zu erreichen, Sie brauchen, um Ihre BaseRepository Einweg entsorgen Ihre IDbConnection. Sie können einen Blick über die Arbeit mit dem repository-pattern und unit of work pattern in der microsoft-Dokumentation docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/...
die using block ist ein notwendiges übel, weil man durch das öffnen von verbindungen zur Datenbank, die geschlossen werden müssen. Also die Wiederholung ist notwendig. Ich würde nur empfehlen, nicht verfangen in das gesamte repository design pattern-Zeug....
welche anderen Muster würden Sie vorschlagen, oder könnte man mit einem Beispiel illustrieren. Ich sah Sie an mit CQRS, aber ich fühlte mich repository wie oben arbeitete für mich KUSS
Off-topic, aber CustomerDTO sollte CustomerDto. Klassen verwenden müssen PascalCase (wie von Microsoft empfohlen). Da die Abkürzung " DTO " ist größer als 2 Zeichen, die Sie brauchen, um es zu Dto.

InformationsquelleAutor Ctrl_Alt_Defeat | 2017-03-22

Schreibe einen Kommentar