Myślałem dziś wieczorem, zastanawiając się nad aplikacją, którą muszę zmienić i przyszło mi to do głowy. Entity Framework Entities to POCO (Plain old CLR Objects), a modele używane w ASP.NET MVC są zwykle również POCO. Zasadniczo oznacza to tylko właściwości, bez metod.
Teraz programowanie OO normalnie pozwala obiektowi obudować jego funkcjonalność, która obejmuje zarówno jego właściwości, jak i metody, co pozwala na wystąpienie polimorfizmu. Wraz ze wzrostem liczby klas POCO, wzorce projektowe, takie jak repozytoria ogólne, stały się bardziej popularne. Kiedy w przeszłości moje obiekty miały własne operacje CRUD, teraz mam je w repozytorium.
Czy to tylko ewolucja w OO, w której operacje CRUD są usuwane z obiektów, aby umożliwić ich oddzielenie, czy może operacje CRUD nie powinny być w przeszłości na poziomie obiektu, a ja się myliłem? cholera, może oba są całkowicie uzasadnione i zawsze były. To tylko spostrzeżenie, które skłoniło mnie do myślenia, więc pomyślałem, że będę szukał innych opinii.
POCO w żaden sposób nie sugeruje, że nie ma metod - chociaż większość przykładów, które widzimy, wykorzystuje wiele funkcji automatycznego wiązania MVC, które dotyczą głównie właściwości i ignorują metody.
Posiadanie trwałości osadzonej w obiektach modelu narusza separację problemów i bardzo utrudnia wykonywanie takich rzeczy, jak testowanie jednostkowe obiektów bez stawiania bazy danych. Nie jest to funkcja obiektu modelu, ale funkcja innej klasy, takiej jak repozytorium.
źródło
Tylko dwa różne podejścia, z których każdy ma swoje zalety.
/programming/1519669/data-access-layer-or-having-object-with-crud-methods
źródło
Ostatnio używam metod rozszerzeń do takich rzeczy.
POCO zawiera logikę, która ma sens tylko dla samego obiektu. Logika biznesowa lub skoordynowana logika obiektowa wchodzi w rozszerzenie BL. Dostęp do danych może przejść do warstwy dostępu do danych lub rozszerzenia dostępu do danych.
To daje bardzo miły
myObject.PriceInCart()
imyObject.Save()
jednocześnie skupiając klasę na danych. Oczywiście w przypadku metod statycznych musiszMyAppDA.Create()
zamiast tegoMyApp.Create()
.źródło