Projekt sklepu internetowego

0

Czołem przebojowi programmersi!
Projektuję swoją aplikację sklepu internetowego w technologii ASP.NET MVC, lecz mam dylemat co do tego, czy dobrze się do tego zabieram.
Mam klasę Product, która zawiera pola wspólne dla wszystkich dostępnych w sklepie produktów (id, cena, dostępność itp) oraz klasy reprezentujące konkretny rodzaj towaru (np. Phone, TVSet), które dziedziczą po wspomnianym Product i posiadają własne, charakterystyczne dla nich pola.

W warstwie Webowej mam osobne kontrolery dla PhonesController i TVSetsController, które komunikują się z serwisami (osobny projekt) PhoneService oraz TVSetService, a te z kolei posiadają metody komunikujące się z DbContext.
Np. dodanie nowego produktu typu telefon wygląda tak:
-wysłanie viewModelu metodą typu post Add w PhonesController do PhoneService
-w odpowiedniej metodzie serwisu mapowanie na obiekt typu Phone i dodanie do bazy poprzez DbContext.
I tak dla każdej klasy reprezentującej typ produktu i dziedziczącej po Product.

Czy to właściwe podejście?

0

Zależy.

Osobiście nie widzę sensu robienia serwisu do każdej tabeli jaką posiadasz w bazie danych (bo z tego by wynikało powyższe).

Do mapowania prostych viewmodeli na modele (i z powrotem) możesz użyć np. automappera.

Jak potrzebujesz do tego dodatkowej (skomplikowanej) logiki to wtedy wydzieliłbym osobny serwis (jakieś walidacje itp.).
Ale może inni mają inne podejście :)

2

Czyli tysiąc ròżnych produktòw w sklepie to u Ciebie tysiąc encji EF, tysiąc serwisòw i tysiąc kontroleròw? Koszmar.

Klasy w programowaniu obiektowym tworzy się w celu definiowania bytów o różnych zachowaniach. U Ciebie wszystkie produkty mają jedno zachowanie - można je sprzedać. Potrzebujesz do tego jednej klasy Product i to wszystko.

0

Ok. A jak np. z parametrami produktów (np. przekątna ekranu tv lub pojemność lodówki itd) , które mogą być różne dla poszczególnych typów? Gdzie je zdefiniować?

0

Każdy produkt może mieć listę atrybutów go opisujących. Listy atrybutów mogą być zdefiniowane np. na poziomie kategorii.

0

@somekind: Doczytałem Twoj dawny post odnośnie EAV. Lecz co w przypadku kiedy chciałbym mieć atrybuty różnego typu (int, bool, string, enum itp)? Kilka tabel z atrybutami i listy atrybutów różnego typu w kategorii?

0

Dictionary<object, object> dict = new Dictionary<object, object>();

        dict.Add("przekątna", "20 cali");
        dict.Add("socket", 1151);
0

Chodziło mi o to, jak to rozegrać w bazie danych.

0

Właściwie podejście to zrobienie jednego generycznego CRUDServisu I jednego Generycznego Kontrolera opierając się na metaprogramowaniu oraz AOP. No, chyba że twój "sklep" jest czymś więcej niż listą produktów. Wtedy można zainwestować również w DM z repo ale nie koniecznie. Twój Serwis nie powinien wiedzieć nic o widoku ani kontrolerze z warstwy web.

0

Albo jakiś nosql i json w bazie.
Albo sql i długi string gdzie oddzielać sobie będziesz wpisy jakimś separatorem.
Albo tabela specyfikacji z relacja do itemu (poniżej).
Ale nie wiem czy to dobry pomysł :)

Robisz sobie klasę która posiada relację N:1 specyfikacji

public class Item
{
public long Id {get; set;}
public string Name {get; set;}
public virtual List<Specification> Specifications {get; set;}
}

public class Specification
{
public long Id {get; set;}
public string Key {get; set;}
public string Value {get; set;}
public long ItemId {get; set;}
public Item Item {get; set;}
}

1

Tabela z produktami
Tabela z opcjami
Tabela z wartościami opcji

Połączenia produkt, opcja, wartość opcji

0

Czy powinienem mieć kilka tabel z wartościami opcji, które różniłyby się typem przechowywanych danych?

0

Nie wiem. Ja mam jedna tabele z wartościami opcji i wszystko jest typu string. W tabeli z opcjami jest informacja o typie w opcji. Coś jak friziu napisal wyżej.
Ale to nieco stare jest. Teraz to nie wiem czy bym nie chcial czegos lepszego.

0

A jak booleanami? Ktoś jeszcze wyraziłby opinie?

Pytanie także czy w CV warto umieszczać biblioteki, z którymi miało się okazję pracować (np. AutoMapper, Autofac, T4MVC itp)?

0

Wszystko fajnie, a teraz chciałbym zapytać was o filtrowanie produktów. Mógłby ktoś ogólnie podpowiedzieć jak należałoby zrealizować filtrowanie, tak aby każda kategoria mogła być filtrowana według przypisanych jej parametrów? Pomyślałem, że można by np. Komputery filtrować po Pamięci RAM, wtedy dla wszystkich komputerów wybrać ich wartości dla Pamięć RAM, a następnie bez powtórzeń wyświetlić w panelu filtra?

0

Generalnie tak, ale musiałbyś napisać jak zrealizowałeś temat opcji bo to po ich wartościach trzeba filtrować.

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