J'étais en train de réfléchir ce soir en réfléchissant à une application que je devais changer et cela m'a fait réfléchir. Les entités Entity Framework sont POCO (Plain old CLR Objects) et les modèles utilisés dans ASP.NET MVC sont généralement également POCO. Cela signifie simplement des propriétés, pas de méthodes.
Maintenant, la programmation OO permet normalement à un objet d'encapsuler ses fonctionnalités, qui incluent ses propriétés ainsi que ses méthodes, cela permet au polymorphisme de se produire. Avec l'essor des classes POCO utilisées, les modèles de conception tels que les référentiels génériques sont devenus plus populaires. Alors que dans le passé mes objets auraient eu leurs propres opérations CRUD, je les ai maintenant sur un référentiel.
Est-ce juste une évolution dans OO où les opérations CRUD sont supprimées des objets pour leur permettre d'être découplées ou peut-être que les opérations CRUD n'auraient pas dû être au niveau de l'objet dans le passé et que j'avais tort? diable, peut-être que les deux sont parfaitement légitimes et l'ont toujours été. C'est juste une observation qui m'a fait réfléchir, alors j'ai pensé que je chercherais d'autres opinions.
POCO n'implique en aucune manière qu'il n'y a pas de méthodes - bien que la plupart des exemples que l'on voit utilisent une grande partie des fonctionnalités de liaison automatique MVC qui traitent principalement des propriétés et ignorent les méthodes.
L'intégration de la persistance dans les objets de votre modèle viole la séparation des préoccupations et rend très difficile de faire des choses comme le test unitaire des objets sans créer une base de données. Ce n'est pas une fonction de l'objet modèle mais une fonction s'il s'agit d'une classe différente telle qu'un référentiel.
la source
Juste deux approches différentes chacune avec leurs propres mérites.
/programming/1519669/data-access-layer-or-having-object-with-crud-methods
la source
J'ai utilisé des méthodes d'extension pour des trucs comme ça récemment.
Le POCO contient une logique qui n'a de sens que pour l'objet lui-même. La logique métier ou la logique d'objet coordonnée va dans une extension BL. L'accès aux données peut aller soit dans une couche d'accès aux données, soit dans une extension d'accès aux données.
Cela vous donne une très belle
myObject.PriceInCart()
etmyObject.Save()
tout en gardant votre classe concentrée sur les données. Bien sûr, pour les méthodes statiques, vous devez avoirMyAppDA.Create()
au lieu deMyApp.Create()
.la source