Ninguno. Punto. Todas las ventajas que a la gente le gusta tirar son ventajas que no son importantes en la gran escala de la imagen. Prefiero una clase base sólida para objetos de entidades que realmente contenga una gran cantidad de código integrado (como lanzar eventos de cambio de propiedad cuando las propiedades cambian) que escribir todo eso yo mismo. Tenga en cuenta que Hice una ORM (en ese momento disponible comercialmente) para .NET antes de que existieran "LINQ" u "ObjectSpaces". Utilicé mapeadores O/R como hace 15 años y nunca encontré un caso en el que POCO fuera realmente algo que valiera la pena.
Dicho esto, los atributos PUEDEN ser malos por otras razones. Prefiero el enfoque Fluent NHibernate en estos días: comencé mi propio mapeador (ahora retirado) con atributos y luego me mudé a archivos basados en XML.
El tema "POCO no me sirve para nada" proviene principalmente del hecho de que las entidades SIMPLEMENTE NO SON OBJETOS NORMALES. Tienen mucha funcionalidad adicional así como limitaciones (como velocidad de consulta, etc.) que el usuario debería tener en cuenta de todos modos. Los ORM, a pesar de LINQ, no se reemplazan de todos modos, aunque si comienzas a usar sus características más interesantes. Por lo tanto, al final obtienes POCO y sigues chupando con una clase base y semántica diferente a izquierda y derecha.
Encuentro que la mayoría de los proponentes de POCO (como en: "debe tener", no "sería bueno") normalmente NO han pensado sus argumentos hasta el final real. Obtienes todo tipo de pensamientos bastante asquerosos, casi al nivel de "los procedimientos almacenados son más rápidos que el SQL dinámico", cosas que simplemente no son ciertas.Cosas como:
- "Quiero tener ellos en los casos en los que no necesitan ser salvados ot la base de datos" (utilizar una agrupación de objetos por separado, sin comprometerse),
- "Me pueden querer tener mi propia funcionalidad en una clase base (el ORM debe allos entidad abstracta clasificada sin funcionalidad, así que ponga su PROPIA clase base por debajo de la del ORM)
- "Quizás quiera reemplazar el ORM por otro" (así que nunca use una funcionalidad más alta) , espero que la API de ORM sea compatible y, de todos modos, PUEDE tener que reescribir partes grandes).
En general, las personas POCO también pasan por alto la gran cantidad de trabajo que, de hecho, es para hacerlo CORRECTO: con cosas como actualizaciones de objetos transaccionales, etc., hay una TONELADA de código en la clase base. Algunas de las interfaces .NET son horribles de implementar en un nivel POCO, aunque mucho más fácil si puede vincularse con el ORM.
tomar el puesto de Thomas Jaskula aquí:
POCO acoplamiento es todo acerca de suelta y capacidad de prueba.
¿Suponia que usted puede probar databinding sin tenerlo? La capacidad de prueba es material de framework simulado, y hay REALMENTE poderosos que incluso pueden "redirigir" llamadas a métodos.
Así que cuando usted está haciendo POCO se puede a prueba su modelo de dominio (si estás haciendo DDD por ejemplo) de forma aislada. No tiene que preocuparse de cómo se conserva . No es necesario que guarde contextos/sesiones para probar su dominio.
Realmente no es cierto. La persistencia debe ser parte de cualquier prueba de modelo de dominio, ya que el modelo de dominio está ahí para persistir. Siempre puede probar escenarios no persistentes simplemente sin comprometer los cambios, pero muchas de las pruebas implicarán persistencia y la falla de eso (es decir, facturas con datos no válidos/faltantes no válidos para escribirse en el disco, por ejemplo).
Otra ventaja es que hay abstracciones menos permeables. Debido a que problemas de persistencia no se presionan a la capa de dominio . Por lo tanto, está aplicando el principio de SRP.
Actualmente no. Un modelo de Dominio apropiado nunca tendrá métodos de persistencia en las entidades. Este es un ORM horrible para empezar (user.Save()). OTOH la clase base hará cosas como la validación (IDataErrorInfo), manejará eventos de actualización de propiedades en archivos persistentes y, en general, le ahorrará muchísimo tiempo.
Como dije antes, parte de la funcionalidad que DEBE tener es realmente difícil de implementar con variables como almacén de datos, como la capacidad de poner una entidad en un modo de actualización, hacer algunos cambios y luego retrotraerlos. No es necesario: dígale a Microsoft que lo use si está disponible en sus cuadrículas de datos (puede cambiar algunas propiedades y luego presionar Escape para deshacer los cambios).
La tercera ventaja es que puedo ver que haciendo POCO su modelo de dominio es más evolutiva y flexible.Puede agregar nuevas funciones más fácil que si fuera junto con la persistencia.
No argumento. No puede jugar agregando campos a una clase peristet sin manejar la persistencia, y puede agregar características no persistentes (métodos) a una clase no-baja igual que a una clase poco.
En general, mi clase base no POCO hizo lo siguiente:
- cambios de propiedad de la manija y IDataErrorInfo - sin que el usuario escribir una línea de código para los campos y elementos de la ORM podía manejar.
- Manejar la información del estado del objeto (Nuevo, Actualizado, etc.). Esta es información intrínseca en mi humilde opinión que también se envía a menudo a la interfaz del usuario. Tenga en cuenta que este no es un método de "guardar", sino simplemente una propiedad EntityStatus.
Y contenía una cantidad de métodos invalidables que la entidad podría usar para extender el comportamiento SIN implementar una interfaz (pública), por lo que los métodos eran realmente privados para la entidad. También tenía algunas propiedades internas más, como obtener acceso al "administrador de objetos" responsable de la entidad, que también era el punto para solicitar otras entidades (enviar consultas), que a veces era necesario.
+1 Creo que esto es correcto, pero siempre debemos tener en cuenta que el acoplamiento débil sirve para muchos otros fines además de simplemente habilitar la capacidad de prueba: http://blog.ploeh.dk/2010/04/07/DependencyInjectionIsLooseCoupling.aspx –
Tienes razón. De todos modos gran publicación. –
¿de qué se tratan estas abstracciones con filtraciones? Si construyo una vista basada en mi modelo EF, ¿alguien puede eliminar la entrada manipulando los datos posteriores de la publicación? ¿O es simplemente una buena manera para que las empresas digan, no confío en ti porque podrías borrar registros cuando yo no te quiero también? ¿Por qué demonios estoy construyendo el proyecto ENTERO? Es estúpido y molesto, no tiene sentido, pasar el 80% del tiempo escribiendo abstracciones y reasignar modelos bien definidos hacia adelante y hacia atrás, cambiando la misma cosa en 4 lugares. No creo que los POCO sean necesarios a menos que escribas algo así como un CMS de lo contrario ... inútil? – ppumkin