Сегодня вечером я думал о каком-то приложении, которое мне нужно изменить, и это заставило меня задуматься. Entity Framework Entity - это POCO (простые старые объекты CLR), а модели, используемые в ASP.NET MVC, обычно также POCO. Это в основном означает только свойства, а не методы.
Теперь ОО-программирование обычно позволяет объекту инкапсулировать свою функциональность, которая включает его свойства, а также методы, что позволяет полиморфизму происходить. С ростом использования классов POCO шаблоны проектирования, такие как универсальные репозитории, стали более популярными. Когда в прошлом у моих объектов были свои собственные операции CRUD, теперь у меня они есть в хранилище.
Является ли это просто эволюцией в ОО, когда операции CRUD удалены из объектов, чтобы их можно было разъединить, или, может быть, операции CRUD не должны были быть на уровне объектов в прошлом, и я ошибался? черт возьми, возможно, оба совершенно законны и всегда были. Это просто наблюдение, которое заставило меня задуматься, так что подумал, что я буду искать другие мнения.
POCO никоим образом не подразумевает, что нет методов - хотя большинство примеров, которые мы видим, используют большую часть функций автоматического связывания MVC, которые в основном имеют дело со свойствами и игнорируют методы.
Наличие постоянства в ваших объектах модели нарушает разделение интересов и делает очень трудным выполнение таких вещей, как модульное тестирование объектов без поддержки базы данных. Это не функция объекта модели, а функция другого класса, такого как хранилище.
источник
Просто два разных подхода, каждый со своими достоинствами.
/programming/1519669/data-access-layer-or-having-object-with-crud-methods
источник
В последнее время я использую методы расширения для подобных вещей.
POCO содержит логику, которая имеет смысл только для самого объекта. Бизнес-логика или логика согласованного объекта входит в расширение BL. Доступ к данным может идти либо на уровень доступа к данным, либо на расширение доступа к данным.
Это дает вам очень хороший
myObject.PriceInCart()
иmyObject.Save()
при этом держать ваш класс сосредоточен на данных. Конечно, для статических методов вам нужно иметьMyAppDA.Create()
вместоMyApp.Create()
.источник