2013-01-24 13 views
5

Rozpoczynam projekt i zmagam się z architekturą dla naszej warstwy dostępu do danych. Zasadniczo będzie musiał interfejs z wieloma backendami z różnymi projektami baz danych.Warstwa dostępu do danych z wieloma serwerami zapleczowymi i różnymi projektami baz danych

Chciałbym wspólny DAL, który następnie wykonuje wspólną funkcję w dowolnym backend. Backendy mają unikalny kod do wstawiania, aktualizowania itp. Zatem dodawanie pracownika w 1 zapleczu będzie miało inny kod w innym.

Próbowałem wzorca repozytorium, ale to po prostu nie dotyczy sytuacji. Skończyłem z metodą Factory, ale ostatecznie utworzę Factory dla każdego obiektu. Mógłbym może tworzyć tylko 1 fabrykę, ale wówczas obiekt Backend musiałby setki funkcji jak „SaveEmployee”, „SavePlan” itp

Teraz mam następujące:

DAL 
    --> DAL.Backend1 
     --> Employee.Save(employee) 
     --> Plan.Save(plan) 
    --> DAL.Backend2 
     --> Employee.Save(employee) 
     --> Plan.Save(plan) 

w projekcie DAL Posiadam wzór Fabryki dla każdego Obiektu, Pracownika, Planu, aby zdecydować, do którego obiektu DAL powrócić i wykonać przeciwko niemu.

Jestem pewien, że nie jest to najlepsza architektura do tego, więc zastanawiam się, czy istnieje lepszy wzór do rozwiązania mojego problemu.

+0

Mniej idące całkowicie dynamicznie i dynamicznie budujące oświadczenia CRUD, będziesz musiał mieć gdzieś konkretną funkcjonalność. Jeśli nie chcesz tego w bazie danych, myślę, że trasa, którą odszedłeś, jest najlepszą drogą. –

+0

Zazwyczaj mam skłonność do złożonego wzoru. – Malk

+1

Zdefiniuj "różne projekty baz danych". Masz na myśli - jeden to SQL, jeden XML, jeden NoSql? Czy możemy mówić o różnych relacyjnych bazach danych? – TomTom

Odpowiedz

0

Wdrożyliśmy tę funkcję w jednym z naszych projektów. Nie jestem pewien, czy to najlepsze rozwiązanie, ale jak na razie działa to dla nas. Mamy jednak niestandardową warstwę DAO opartą na szablonach CodeSmith, które generują dla nas klasy CRUD. Zasadniczo stworzyliśmy singleton, który reprezentuje brokera połączeń dla wszystkich użytkowników. Kiedy użytkownik się loguje, wybiera bazę danych, z którą chce się połączyć (chociaż niektóre filtry IP zawężają opcje, najlepiej do 1). Login przechowuje token połączenia z powiązanym użytkownikiem, a klasa bazowa wygenerowanej warstwy DAO wywołuje brokera połączenia w celu pobrania odpowiedniego ciągu połączenia. W ten sposób za każdym razem, gdy obiekt DAO zostanie wywołany, ciąg połączenia zostanie zebrany, zanim obiekt DAO podejmie próbę połączenia z bazą danych.

Powiązane problemy