/ / Aby hermetyzować połączenie z bazą danych w obiektach biznesowych, czy nie? - .net, baza danych, projektowanie

Aby hermetyzować połączenie z bazą danych w obiektach biznesowych, czy nie? - .net, baza danych, projektowanie

Zwykle lubię sam tworzyć połączenie z bazą danych i kontrolować jego żywotność ręcznie za pomocą `using {}".

SqlConnection sqlConnection = new SqlConnection( connectionString );
using( sqlConnection ) {
BusinessObject myBusinessObject = new BusinessObject( sqlConnection );
// do stuff with the business object
...
}

W ten sposób jest widoczny i oczywisty, że jestemużycie zasobu, który należy odpowiednio oczyścić. Jednak kończy się to powtarzalnym wysiłkiem. Kusiło mnie, aby utworzyć połączenie Sql wewnątrz obiektu biznesowego i zaimplementować na nim IDisposable. Zamknęłoby to połączenie w metodzie Dispose ().

using( BusinessObject myBusinessObject = new BusinessObject() ) {
// do stuff with myBusinessObject
...
}

Problem, który mam, polega na tym, że nie jest oczywiste, że obiekt biznesowy musi zostać usunięty, chyba że jest używany.

Jak byście to zrobili?

Odpowiedzi:

4 dla odpowiedzi № 1

Obiekty biznesowe powinny być rozsądnie (lubcałkowicie) głupie w odniesieniu do bazy danych. Należy zaimplementować pewien rodzaj obiektu warstwy dostępu (repozytorium lub kontekst danych), który wie, jak utrwalić obiekty biznesowe w bazie danych i zachować logikę połączenia zamiast umieszczać kod w każdym z obiektów biznesowych. Twoje repozytorium lub kontekst byłyby jednorazowe, aby można było je posprzątać. Sugestia @Marca, że ​​podążasz za wzorcem Jednostki Pracy jest dobra.

Możesz spojrzeć na LINQtoSQL, nHibernate,Subsonic, itp., Aby je wykorzystać lub przynajmniej pomysły na strukturę dobrej warstwy danych, jeśli nalegasz na pisanie własnych. Z własnego doświadczenia mogę powiedzieć, że korzystanie z istniejącej technologii jest znacznie łatwiejsze niż pisanie i utrzymywanie własnego.


3 dla odpowiedzi № 2

Cóż, najpierw zostawię połączenia z repozytorium.

Po drugie, nie utrzymałbym połączenia w zawieszeniuwokół obiektu - używałbym go tylko do jednostki pracy (tj. do pojedynczej metody) Prawdopodobnie (z powodu pulowania) i tak wrócisz do tego samego fizycznego połączenia. System już ma długą drogę do radzenia sobie z takimi rzeczami, więc nie musisz tego robić.

Trudniejsze są transakcje, gdzie TransactionScope jest o wiele łatwiejsze niż przekazywanie obiektu db-transaction.


0 dla odpowiedzi № 3

Nie sądzę, że obiekt biznesowy powinien wiedzieć lubDbasz o to, czy jest on trwały, czy też nie. Pojedynczy trwały obiekt biznesowy nie może wiedzieć, kiedy jest częścią większej jednostki pracy, ale odpowiedzialność za warstwę usługi należy pozostawić poza obiektami biznesowymi. warstwa usługi jest właściwym miejscem do pozyskiwania połączeń, zwykle z puli połączeń, ustawiania granic transakcji, zatwierdzania lub wycofywania i czyszczenia.