Eu estava pensando hoje à noite enquanto refletia sobre algum aplicativo que eu precisava mudar e isso me fez pensar. Entity Framework Entidades são POCO (Plain CLR Objects antigos) e os modelos usados no ASP.NET MVC geralmente também são POCO. Isso basicamente significa apenas propriedades, sem métodos.
Agora, a programação OO normalmente permite que um objeto encapsule sua funcionalidade, que inclui suas propriedades e métodos, permitindo que o polimorfismo aconteça. Com o aumento das classes POCO sendo usadas, padrões de design como repositórios genéricos se tornaram mais populares. Quando, no passado, meus objetos tinham suas próprias operações CRUD, agora as tenho em um repositório.
É apenas uma evolução no OO em que as operações CRUD são removidas dos objetos para permitir que sejam dissociadas ou talvez as operações CRUD não devessem estar no nível do objeto no passado e eu estava errado? diabos, talvez ambos sejam perfeitamente legítimos e sempre foram. É apenas uma observação que me fez pensar, então pensei em procurar outras opiniões.
O POCO de forma alguma implica que não existem métodos - embora a maioria dos exemplos que se vê use muitos dos recursos de ligação automática do MVC, que lidam principalmente com propriedades e ignoram métodos.
A persistência incorporada nos objetos do modelo viola a separação de preocupações e dificulta a execução de testes de unidade, sem levantar um banco de dados. Não é uma função do objeto de modelo, mas uma função se uma classe diferente, como um repositório.
fonte
Apenas duas abordagens diferentes, cada uma com seus próprios méritos.
/programming/1519669/data-access-layer-or-having-object-with-crud-methods
fonte
Ultimamente, tenho usado métodos de extensão para coisas como essa.
O POCO contém lógica que só faz sentido para o próprio objeto. Lógica comercial ou lógica de objeto coordenado entra em uma extensão BL. O acesso a dados pode ir para uma camada de acesso a dados ou uma extensão de acesso a dados.
Isso proporciona uma ótima experiência
myObject.PriceInCart()
e,myObject.Save()
ao mesmo tempo, mantém sua classe focada nos dados. Claro que para métodos estáticos você precisa ter emMyAppDA.Create()
vez deMyApp.Create()
.fonte