Czy to zły projekt? Jak można to poprawić?

9

Jakiś czas temu napisałem poniższe, ale ostatnio przyjechałem je przejrzeć i nie sądzę, żeby to był dobry projekt.

Projekt jest dla pewnego rodzaju modułowej warstwy bazy danych przy użyciu Entity Framework 4. Istnieje jeden obiekt bazy danych, który ładuje (leniwie) konteksty struktury encji z bibliotek zewnętrznych w określonej lokalizacji, a instancje załadowanych kontekstów są przechowywane w tabeli hash przeciwko ich nazwa (EG „ContentMgmtContext”).

Cały kontakt z bazą danych w tym systemie odbywa się poprzez procedury składowane. Aby wykonać wywołanie do bazy danych, podpis metody zapytania wygląda następująco:

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

Ta modułowość jest czymś, co lubię. Jest jednak jedna istotna wada tego podejścia: when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.w modelu obiekty z warstwy bazy danych są tłumaczone na nowe obiekty, których używają widok i kontroler.

Myślę, że to zły projekt, ale jak mogę go poprawić? Rozważałem dodanie pustego interfejsu, IStoredProecedureObjectaby nadać każdemu typowi danych zwracanych przez procedurę przechowywaną wspólny typ podstawowy, jednak wydaje się, że jest to udaremniane przez Entity Framework. Za każdym razem, gdy .edmxplik jest ponownie kompilowany, kod jest generowany od nowa, a wszelkie dodatki usuwane. Czy jest jakiś sposób, aby temu zapobiec?

Jak mogę ulepszyć ten projekt? Co (jeszcze) jest z tym nie tak? A może jestem na dobrej drodze?

Andy Hunt
źródło

Odpowiedzi:

6

Oświadczenie: Nie używam frameworku encji i jestem mocno stronniczy w stosunku do niemal dowolnego frameworka bazy danych.

Wygląda na to, że zrobiłeś opakowanie.

Rozróżniam „wrapper” i „layer”. Warstwa jest czymś, co możesz skompilować do własnej biblioteki DLL / projektu / jar / cokolwiek innego. Warstwa dostępu do danych. Wrapper jest klasą „pomocnika”, której używasz w tej bibliotece DLL. W celu uproszczenia interfejsu lub wyeliminowania powielania.

Problem z upraszczaniem interfejsu dostępu do bazy danych jest taki, że zwykle nie jest to proste. Albo kończy się duplikowanie interfejsu ADO / JDBC / etc. Albo zmusisz ludzi do ominięcia tego. Owijarki zwykle robią wszelkiego rodzaju niepożądane rzeczy. Mogą automatycznie zamykać połączenie, gdy będzie ono potrzebne do obsługi transakcji. Często omyłkowo pozostawiają otwarte połączenia, jeśli trzeba było przesyłać strumieniowo dane, i używają jednego z tych śmieciowych języków. Aby zapewnić pełną moc biblioteki za opakowaniem, musisz ją zduplikować.

Biblioteki takie jak ADO / JDBC są już WIELKIM interfejsem. Są to jedne z najlepszych przykładów prawidłowego wykonania OOP. Wolałbym użyć ich zamiast opakowania, które jakiś czarodziej wyciągnął z kapelusza.

Klasyczny interfejs JDBC / ADO jest dobrze znany i zrozumiały. Opakowanie, które wyciągnąłeś z kapelusza, nie jest.

Chcesz zredukować zbędne parametry? Dodaj? Spójrz na generyczne. Lub po prostu zaakceptuj to, próbując zredukować „paramter.Add”, tak naprawdę po prostu przesuń „.add” na inną warstwę kodu.

BTW to świetne pytanie. Głosowałbym za tym 10 razy, gdybym mógł.

Edycja: Oczywiście kod JDBC byłby ukryty w warstwie dostępu do danych.

Lord Tydus
źródło
Z perspektywy czasu zgadzam się, że jest to bardziej opasanie wokół EF 4 niż jego samego. Ideą było umożliwienie ponownego wykorzystania różnych połączeń z bazami danych (takich jak standardowy model danych), przy jednoczesnym zapewnieniu jednego punktu wejścia dla wielu baz danych, z których każda ma cechę wielokrotnego użytku. To opakowanie bazy danych jest wkompilowane w osobną bibliotekę (wraz z inną logiką biznesową). Jak sugerowałbyś zmianę mojego projektu, aby go ulepszyć?
Andy Hunt
+1 za świetną zawartość pomimo twojego uprzedzenia EF ... chociaż EF jest czymś więcej niż strukturą pomocniczą DB. Masz rację co do tego, że próbował to zrobić.
SoylentGray