fabryka abstrakcyjna i i interfejs obsługujący dane

Odpowiedz Nowy wątek
2014-12-27 20:33
Pijany Samiec
0

Witam,

Mam klasy w moim projekcie. Niech będą to przykładowo proste klasy:
U

  • User
  • Group
  • Car

Każde z tych danych można: zapisać, aktualizować, usuwać i wczytać.
Problemem jest to, że chciałbym by owe dane był zapisywalne w bazie danych, xml, txt itd.

Wychodzi, więc standardowo fabryka abstrakcyjna, gdzie w osobnych klasach mam logikę zapisywania danych w różnych formatach i różnych miejscach.

Jak jednak w ładny sposób przekazać aplikacji informację o tym, jak ma zapisywać dane?
Np. aplikacja WWW ma zapisać dane do bazy danych, ale już aplikacja mobilna ma je zapisać do pliku xml.
Obie te aplikacje korzystają z tych samych dll-ek, gdzie zawarta jest logika.

Myślałem o np. tworzeniu osobnych dll-ek do zapisywania do bazy danych, zapisywania do xml itd, a następnie sprawdzać która dll-ka jest w katalogu i wywołać odpowiedni interfejs zwracający daną klasę. Ale może da się lepiej?

Pozdrawiam.

Pozostało 580 znaków

2014-12-28 00:37
0

Czy dobrze zrozumiałem - logika działania na bazie jest ta sama, format bazy się zmienia.

To nie lepiej wypuścić jeden interfejs po stronie logiki, odpowiedni dorobić po stronie "kontaktu z bazą" niezależnie do formatu? Izolujesz warstwę abstrakcji od fizycznych operacji, przeca logika nie musi wiedzieć czy robisz na SQLu, XMLu, czy parsujesz tekst regexem...

Pozostało 580 znaków

2014-12-28 09:54
Pijany Samiec
0

Dokładnie dobrze rozumiesz. Właśnie o to chodzi.
Jak mam takie coś wykonać estetycznie?

Jest sobie logika np: zakładanie usera.
Aby założyć usera trzeba wykonać metodę Save, więc mam w interfejsie metodę Save.
Obiekt klasy User ma w sobie obiekt interfejsu - czyli niezależnie od formatu bazy danych.

I ten fragment będzie działać. Pytanie jednak jest takie: Jak przekazać obiektowi klasy User, że ma zapisywać dane do konkretnego miejsca.

W kodzie wygląda to tak:

    interface IOperationData
    {
        void Save();
        object Load(int id);
        void Update();
        void Delete();
    }
    class User
    {
        private int id = 0;
        private IOperationData operationData;
 
        public User()
        {
        }

Każdy obiekt Usera będzie mógł wykorzystać interfejs (xml, baza danych, txt) do operacji na danych.
jednak jak przekazać sensownie informację, że: "Aktualnie masz zapisywać dane do bazy".

Opcje w aplikacji nie wchodzą w grę, gdyż format zapisu zależeć będzie od rodzaju aplikacji - mobilna, desktopowa, www itd.

Pozostało 580 znaków

2014-12-28 12:30
Złoty Samiec
0

Ja zrobiłbym to tak:

Tworzysz interfejs IUserRepository który ma potrzebne metody, do tego w zależności od potrzeb implementujące go klasy (np. XmlUserRepository). W całej aplikacji używasz tylko tego interfejsu, a dostarczeniem odpowiedniej implementacji zajmuję się jakiś kontener Dependency Injection (np. NInject). Wtedy to z jakiej implementacji aplikacja ma korzystać jest tylko w jednym miejscu (konfiguracji kontenera DI)

Pozostało 580 znaków

2014-12-28 12:39
Pijany Samiec
0

Ooo dobry pomysł, konfiguracja i kontener.
Dzięki bardzo :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0