2009-09-01 10 views
8

Próbuję dowiedzieć się, jak rozwiązać ten problem. Muszę wstawić niektóre dane w tabelach 2 pozwala im Tabela A i B. Tabela zadzwonićCzy repozytorium powinno wywoływać inne repozytorium? Czy repozytorium może wywoływać warstwę usługi?

Table A has these columns 
AId<PK> 
A1 
A2 
A3 

Table B has 
AId<PK> 
A1 
B2 
B3 
B4 

Teraz moje pierwsze pytanie była inna repozytorium powinien zadzwonić innego repozytorium? Nie sądzę, że rozwiąże to mój obecny problem, ale chcę to wiedzieć na przyszłość?

Teraz na mój problem.

kiedy wywołuję kreację w mojej warstwie repozytorium (TableARepository), aby utworzyć tabelę A. Natychmiast utworzę pola dla tableB też.

// linq to sql. 
    TableA myATable = new TableA(); 
    dbContext.myATable.A1 = "hi"; // all these values would come from parameters. 
    dbContext.myATable.A2 = "bye"; 
    dbContext.myATable.A3 = "go"; 

    dbContext.myATable.insertOnSubmit(TableA); 
    dbContext.SubmitChanges(); 

    TableB myBTable = new TableB(); 
    dbContext.myBTable.AId = myATable.AId; 
    dbContext.myBTable.A1 = myATable.A1; 
    dbContext.myBTable.B2 = "2"; 
    dbContext.myBTable.B3 = "3"; 
    dbContext.myBTable.B4 = "4"; 

    dbContext.myATable.insertOnSubmit(TableB); 
    dbContext.SubmitChanges(); 

Więc myślę, że to jest w porządku i nie sądzę, że muszę zadzwonić myBTable repozytorium (aby utworzyć tableB) dla tego lub warstwy usług.

Tutaj jest problem. Tabela TabelaB powinna zawierać tylko informacje wstawione do tej tabeli tylko wtedy, gdy nie jest równa "cześć".

so param1 != "hi" // insert 
    param1 == "hi" // ignore and only insert table A 

więc oznaczałoby to, że będę musiał zawinąć moja TableB jak ten

if(param1 != "hi") 
{ 
    TableB myBTable = new TableB(); 
    dbContext.myBTable.AId = myATable.AId; 
    dbContext.myBTable.A1 = myATable.A1; 
    dbContext.myBTable.B2 = "2"; 
    dbContext.myBTable.B3 = "3"; 
    dbContext.myBTable.B4 = "4"; 

    dbContext.myATable.insertOnSubmit(TableB); 
    dbContext.SubmitChanges(); 
} 

Teraz nie jestem pewien, czy powinien robić to tutaj, ponieważ to wydaje się prawie jak logiki biznesowej. ale jednocześnie nie jestem pewien, jak wykonać tę logikę biznesową, ponieważ tak czy inaczej nadal muszę przekazywać wartość, aby wstawić ją do metody create, nawet jeśli jest ona null (A1 jest polem zerowym).

Więc powinienem zadzwonić do przekazu warstwy serwisowej tableB w TableA.Id, A1 i sprawdzić czym jest A1. Jeśli dobrze, przejdź do repozytorium TableB i wstaw to w ten sposób?

Tak TableARepostiory -> warstwa serwisowa TableB -> TableBRepository (jeśli znaleziono, że ta wartość! = "Hi").

Więc nie jestem pewien, co robić.

Odpowiedz

10

Nie - nie mogę wymyślić powodu, dla którego repozytorium może połączyć się z innym repozytorium lub inną usługą. Ich jedynym zmartwieniem powinno być utrzymywanie twoich bytów i pobieranie obiektów z magazynu danych. Powinny one ignorować większość aspektów aplikacji, z wyjątkiem domeny bazowej.

Wygląda na to, że zakładasz, że powinny one być repozytorium na tabelę, co jest nieprawidłowe. Powinno istnieć repozytorium dla każdego zagregowanego katalogu głównego, a to repozytorium powinno zająć się przechowywaniem danych do wszystkich powiązanych tabel. Jest w porządku, aby repozytorium miało pewną logikę dotyczącą miejsca lub sposobu zapisywania danych, ale najlepiej byłoby, jeśli to możliwe, być enkapsulowane we wspólnym obszarze.

Na przykład, gdybyś miał obiekty osoby i musiał zapisać je w różnych tabelach w zależności od płci, możesz to zrobić przy użyciu dziedziczenia (jeśli (osoba jest kobietą) zapisać tutaj ...) lub właściwości na obiekcie (jeśli (person.Gender == Gender.Female) zapisz tutaj ...) lub Dane techniczne (jeśli (FemaleSpecification.IsSatisfiedBy (osoba)) zapisz tutaj ...).

+0

Ja zawsze się nad tym zastanawiałem, ponieważ wszystkie przykłady, które widziałem są tak małe, że wydawały się, że zrobiły repozytorium na stół. Chyba teraz wiem na przyszłość. Sądzę, że będę musiał mieć na razie trochę logiki, ponieważ nie będę rededować wszystkiego, żeby to naprawić. W każdym razie nie teraz. – chobo2

1

Klauzula strażnika (param1! = "Hi") powinna znajdować się w wyższej warstwie, takiej jak warstwa usługi aplikacji.

Warstwa usług powinna koordynować dwa repozytoria.

+0

jak? Tak jak nie mogę wymyślić, jak to zrobić. Chyba że mam 2 różne przeciążone metody z zasadniczo tym samym kodem, oczekuję jednej linii. – chobo2

Powiązane problemy