LINQ a warstwa dostępu do danych

10

Nauczyłem się zawsze obsługiwać dowolny kod dostępu do danych w całkowicie oddzielnej „warstwie” od mojej logiki biznesowej i kodu interfejsu użytkownika. To zawsze była dla mnie bardzo dobra architektura, a wszelkie „zasady” i najlepsze praktyki, które widzę, wciąż pasują do tego stylu kodowania, szczególnie Zasada Jednej Odpowiedzialności .

Do większości moich domowych projektów używałbym własnej ORM, którą stworzyłem, którą zawsze zamierzałem tworzyć open source. Jednak od tego czasu LINQ stał się dostępny, co było bardzo podobne do mojego ORM (ale ... lepiej).

Nic nie mogłem wcześniej zrobić z moją własną ORM, czego nie mogę teraz zrobić z LINQ (z wyjątkiem bitów integracji REST). Więc moje pytanie brzmi; czy LINQ jest moją nową warstwą dostępu do danych? Czy w ogóle potrzebuję już tej warstwy? Czy moja BLL powinna rozmawiać bezpośrednio z LINQ? A może nadal jest to zła praktyka?

Edytować:

Pierwotne pytanie dotyczyło LINQ to Entities, ale istnieje wiele interesujących odpowiedzi dotyczących LINQ to SQL. Jakie są przemyślenia na ich temat? Rozumiem, że LINQ to SQL nie może tak naprawdę zastąpić DAL, ale czy Entity Framework?

Connell
źródło

Odpowiedzi:

7

Chociaż możesz po prostu umieścić zapytania LINQ w swojej BLL, może to prowadzić do duplikacji kodu. Nadal będę tworzyć repozytoria, które będą opakowaniem dla zapytań LINQ. Spowoduje to oddzielenie kodu bazy danych od kodu BLL i będzie przydatne, gdy zdecydujesz się zmodyfikować kod dostępu do danych (tj. Przejść do Dapper lub do wstępnie skompilowanych zapytań).

Pomoże również w testowaniu jednostkowym , ponieważ repozytoria można łatwo wyśmiewać.

Jakub Konecki
źródło
6

Nadal możesz mieć DAL, ale tylko on może używać LINQ to SQL zamiast tego, czego wcześniej używałeś. Tak i tak to robię. Nie zmuszaj BLL do bezpośredniego korzystania z LINQ-SQL w celu uzyskania dostępu do danych.

neeKo
źródło
Zgadzam się, LINQ to SQL to tylko język zapytań, który może uniemożliwić Ci pisanie dużej ilości kodu instalacyjnego. Nie hermetyzuje dostępu do danych w Twojej aplikacji, tak jak powinien to robić DAL.
neontapir,
Naprawdę miałem na myśli LINQ do Entities. Używam również wielu LINQ do Objects, ale uważam to za logikę biznesową. Rozumiem za kulisami różnicę między jednostkami a LINQ-SQL, ale nigdy nie korzystałem z LINQ-SQL. Czy są jakieś różnice w składni?
Connell
2

Linq nie dotyczy dostępu do danych, możesz użyć linq do dowolnego IEnumerable.

Czy próbowałeś najpierw zaprojektować aplikację, nie myśląc o bazie danych? Oznacza to, że zaimplementuj aplikację i użyj pewnego rodzaju repozytorium. Następnie używasz dowolnej techniki, aby zaimplementować te repozytoria. W ten sposób masz całkowicie oddzielone rozwiązanie, w którym możesz podłączyć dowolną warstwę dostępu do danych, którą chcesz.

W tej warstwie dostępu do danych można użyć własnego ORM lub Linqa do sql, nie ma to znaczenia, o ile warstwa dostępu do danych implementuje zdefiniowane repozytoria.

Tomas Jansson
źródło
1

O ile „warstwa logiki biznesowej” nie dotyczy transakcji i wydajności zapytań, nadal istnieje potrzeba DAL.

LINQ sprawia, że ​​deklaracja zapytania jest procesem w czasie projektowania (inaczej sprawdzany przez kompilator).

Dostawcy zapytań LINQ (tacy jak LinqToSql i LinqToEntities) nadal dokonują konwersji w czasie wykonywania zadeklarowanych zapytań na tekst sql. Następnie DBMS nadal interpretuje zapytania w czasie wykonywania, generuje plan zapytań w czasie wykonywania itp.

To tylko niewielka część DAL.

Amy B.
źródło