2012-06-18 8 views
5

Powiel możliwe:
What are the benefits of Persistence Ignorance?Nie rozumiem punkt niezależności trwałości

Po pewnym czasie, a niektóre pytania próbuje dowiedzieć się, Entity Framework, Doszedłem do wniosek, że po prostu nie rozumiem, czym jest uporczywość w ignorancji.

Jak najlepiej jak mogę powiedzieć, praktyczna różnica między używaniem utrwalania świadomy przedmioty i te oporność-ignorant jest to, że jeden przyzwyczaja coś

Person p = Person.Load(id); 
p.Active = false; 
p.Save(); 

a drugi służy wzdłuż linii

using (var context = new MyContext()) 
{ 
    Person p = context.Persons.Single(x => x.ID == id); 
    p.Active = false; 
    context.SaveChanges(); 
} 

W pierwszym przypadku mogę zwrócić p i zadzwonić pod numer Save() w pewnym późniejszym momencie. W tym ostatnim mogę zwrócić p, ale muszę go zapisać w nowym MyContext(), aby go zapisać. W pierwszym przypadku, zakładając, że osoba dziedziczy Load() i Save() z jakiegoś obiektu bazowego, który faktycznie obsługuje logikę bazy danych, jeśli chciałem zmienić trwałość, wymagałoby to po prostu zmiany tego obiektu podstawowego (lub nawet po prostu mieć IPersistent interfejs, który wiele klas bazowych może zaimplementować, aby uzyskać dostęp do wielu sklepów). W tym drugim przypadku musiałbym zmienić każde wystąpienie MyContext, gdyby warstwa trwałości uległa zmianie, a wykonanie fragmentarycznych czynności byłoby ohydnie skomplikowane.

Mam wrażenie, że upór, ignorancja jest dobrą rzeczą. Po prostu nie mogę zrozumieć, dlaczego. Wydaje się, że dużo trudniej jest skonfigurować, pracować, zmienić hurt i zmienić fragmentarycznie, bez żadnej przewagi w tej komplikacji. Czy brakuje mi czegoś ważnego, czy też całe moje rozumienie tego, co świadome wytrwałości/ignorancji oznacza wadliwe?

+0

Oprócz Trwałość podmioty niedouczonych, należy również streszczenie dala Twój ORM. Typową metodą jest [Wzór repozytorium] (http://martinfowler.com/eaaCatalog/repository.html). – jrummell

+0

@DavidHall, nie sądzę, że to duplikat. Przynajmniej po przeczytaniu odpowiedzi na drugie pytanie wciąż nie rozumiem, dlaczego * odpowiednio wyabstrahowany * obiekt świadomy uporu jest lepszy niż uporczywy uporczywy obiekt. – Bobson

Odpowiedz

5

Niewiedza dotycząca perswazji jest częścią oddzielenia problemów. Powinieneś zadać sobie pytanie, dlaczego osoba powinna wiedzieć, w jaki sposób powinna być załadowana lub zapisana? Osoba powinna poradzić sobie z własną małą domeną.

PI oznacza, że ​​Osoba nie dba o to, czy pochodzi ona z pamięci, SQL, płaskiego binarnego lub jakiegokolwiek innego środka Persistance i pozwala ci później zastąpić warstwę persistance czymś innym. Początkowo możesz rozwinąć swoją aplikację, aby używać płaskich plików binarnych z podstawowymi serializatorami do przechowywania danych. Później możesz dokonać aktualizacji do SQL ze względu na wydajność - i ta zmiana jest wymagana tylko w jednym miejscu, którego -job- ma obsłużyć persistance, powiązaną warstwę/komponent. W przeciwnym razie musisz przejść przez całą bazę kodu, aby zmienić małe części tu i tam, które dotyczą uporczywości.

+0

Zobacz, moje doświadczenie było dokładnie odwrotne. Obiekt osoby, który dziedziczy po typie bazowym, który wie o trwałości, jest trywialny, aby przejść do nowej warstwy trwałości, ale obiekt PI Person jest miłym bólem do zmiany. Z pewnością nie będę twierdził, że obiekt typu Aware jest lepszy, jeśli każdy obiekt musi mieć własną * oddzielną * wiedzę o tym, jak uzyskać dostęp do jego danych, ale dopóki nie można go streścić w jednym miejscu, nie widzę jak PI jest lepszy. – Bobson

1

Wystarczy mówić o swojej przykład pisząc Person.Load (ID) mówisz - obciążenie tego obiektu przez patrząc na jego identyfikatorze - jesteś tworząc sztywną fabryczny wzór, przez wich można dostać tylko obiekty, jeśli znasz ich identyfikator, później przekonasz się, że musisz wyodrębnić rekordy na podstawie niektórych kryteriów wyszukiwania, a dodasz więcej metod fabrycznych, podczas gdy drugie rozwiązanie już daje ci pełną swobodę.

Drugie rozwiązanie jest idealne do przełączania logiki trwałości w czasie wykonywania, ponieważ jest ona oddzielona od modelu obiektowego, można theorically zdecydować silnik wich trwałości używać wewnątrz kodu klienta, bez sztywno i dotykania OM, a Fałszywe jest powiedzenie, że musisz zmienić każde wystąpienie z MyContext, powinieneś napisać swój kod klienta, aby umożliwić mu odebranie kontekstu z rodzaju klasy fabrycznej lub zastrzyku zależności.

Jako przykład można mieć to Pseudokod:

var person = onlineDbContext.Persons.Single(x=>x.Guid == myguid); 

offlineDbContext.Persons.Add(person) 
offlineDbContest.SaveOrUpdate(); 
+0

Czy ten pseudokod musi znajdować się w dwóch oddzielnych instrukcjach 'using()', po jednym dla każdego kontekstu? Ponadto, w jaki sposób mogę mieć wiele kontekstów, które obsługują ten sam obiekt? – Bobson

+0

Nie napisałem instrukcji użycia, ponieważ nie ma to znaczenia, nawet nie mówię o konkretnej ORM-u, pokazałem tylko, że jeśli oddzielisz dane w ten sposób, w jaki jest obsługiwane, jak w liście od listonosza , masz więcej możliwości. Jak stworzyć innego listonosza to kolejny temat. – Spartaco

+0

Wystarczająco fair. Jednak nadal nie mam pojęcia, jak używać "osoby" w innym kontekście. Posiadanie innego listonosza nie pomaga, jeśli nowy listonosz znajduje się na innej trasie i nigdy nie odwiedza mojego miejsca. Ta odpowiedź wydaje mi się dokładnie tym, czego szukam, staram się ją zrozumieć. – Bobson