Jaka jest najlepsza praktyka w odwzorowywaniu elementów bazy danych na modele i wykonywanie logiki biznesowej? Widziałem znacznie różne implementacje obu. Zauważyłem wiele implementacji, w których repozytorium (w warstwie danych) samo jest odpowiedzialne za mapowanie jednostek bazy danych do modeli domen. Na przykład, repozytorium że byłoby to zrobić:Odwzorowywanie obiektów na modele i realizowanie logiki biznesowej w środowisku ASP.NET MVC
public IQueryable<Person> GetPersons()
{
return DbSet.Select(s => new Person
{
Id = s.Id,
FirstName= s.FirstName,
Surname= s.Surname,
Location = s.Location,
});
}
ale o poszukiwanej kompleksowo wokół SO na N Tier projektu, Zauważyłem, że podczas gdy nie ma panaceum, w większości przypadków jest to wskazane, aby wykonać mapowanie wewnątrz kontroler w projekcie MVC ręcznie lub za pomocą programu Mapper. Zostało również powtórzone, że warstwa Serwisu nigdy nie powinna wykonywać mapowania i że odpowiedzialność powinna spoczywać na logice biznesowej. Kilka pytań tutaj:
- Która metoda jest wskazana w odniesieniu do tego, gdzie mapować jednostki do modeli i odwrotnie? Czy repozytorium powinno to zrobić, czy też powinno się wykonać mapowanie w kontrolerze?
- Załóżmy, że chcę wykonać jakąś logikę biznesową na elementach, które pobrałem z bazy danych, na przykład zwrócić pełną nazwę
Person
lub zwiększyć wiek wszystkichPerson
s przez 10 lat, gdzie powinna to być operacja wejść na afisz. Na samym modelu? Na przykład czy mam na modelu właściwośćFullName
, która oblicza imię i nazwisko oraz wiek? Czy mogę zdefiniować jakąś usługę wewnątrz mojej warstwy usługi, aby wykonać logikę biznesową?
EDIT
Wow tak wielu bliskich głosów. Przepraszam, nie szukałem wystarczająco dokładnie. W 'gdzie do wykonywania logiki biznesowej' Mam problem podniesiony tutaj można już znaleźć na SO i gdzie indziej (choć nieco tajemniczo przekazywane w czasie):
Validating with a Service Layer by Stephen Walther
Another great, but more generic answer here on SO
Where Should I put My Controller Business Logic in MVC
Does a Service Map Entities to a View Model
Jednak wciąż nie znalazłem standardowego rozwiązania mojego pytania dotyczącego mapowania i myślę, że mogłem być może bardziej wymownie wypowiedzieć moje pytanie. Ogólny konsens wydaje się taki, że logika biznesowa wchodzi w warstwę usługi, a mapowanie modeli domenowych na modele widokowe powinno odbywać się w warstwie kontrolera/prezentacji. Ponieważ wskazane jest, aby nie umieszczać obiektów DB w żadnych warstwach innych niż warstwa danych, zaleca się mapowanie swoich jednostek do modeli domen w warstwie danych ręcznie lub za pomocą narzędzia odwzorowującego, takiego jak Auto Mapper (to jest to, co zebrałem od czytanie wielu artykułów). Moje zamieszanie pojawiło się w związku z pytaniem, gdzie należy mapować jednostki do modeli domen i mapować modele domen, aby wyświetlić modele. Jednak, jak już wcześniej wspomniałem, mogłem wyrazić moje pytanie jaśniej. Powodem mojego nieporozumienia było to, że przeczytałem, że jednostki odwzorowujące do modeli domen powinny się zdarzyć w kontrolerze, należy to raczej zmienić, aby powiedzieć: "Odwzorowywanie obiektów na modele domen powinno się odbywać później w danych, a mapowanie modeli domenowych, aby wyświetlać modele powinien mieć miejsce w kontrolerze