2009-05-20 4 views
55

Veo dos "escuelas de pensamiento" principales cuando se trata de crear aplicaciones de mayor escala para toda la empresa en .NET (Winforms, WPF, ASP.NET).Patrón de depósito frente a objetos comerciales "inteligentes"

Algunas personas usan el "patrón de repositorio" que usa un repositorio que sabe cómo buscar, insertar, actualizar y eliminar objetos. Esos objetos son bastante "tontos", ya que no necesariamente contienen una gran cantidad de lógica, p. son más o menos objetos de transferencia de datos.

El otro campo usa lo que yo llamo objetos comerciales "inteligentes" que saben cómo cargarse, y generalmente tienen un método Save(), posiblemente Update() o incluso Delete(). Aquí realmente no necesita ningún repositorio: los propios objetos saben cómo cargar y guardarse.

La gran pregunta es: ¿cuál usa usted o prefiere? ¿Y por qué?

¿Utiliza el mismo enfoque en todas sus aplicaciones, o tiene algún criterio en particular cuando elegir un enfoque sobre el otro? Si es así, ¿cuáles son esos criterios?

No estoy tratando de comenzar una guerra de llama aquí, simplemente tratando de averiguar qué piensan todos sobre esto y cuál es su opinión, y por qué usa uno (o ambos) patrones sobre el otro.

¡Gracias por cualquier aporte constructivo!

Respuesta

38

Utilizo el patrón de repositorio debido al principio de responsabilidad única. No quiero que cada objeto individual tenga que saber cómo guardar, actualizar, eliminarse, cuando esto puede ser manejado por un solo repositorio genérico

+3

En ese caso, un repositorio genérico necesita saber cómo cargar todo tipo de objetos. –

+0

y porque es genérico puede manejar la carga de todo tipo de objetos. También hace más simples las pruebas unitarias –

+4

También me gusta el estilo de repositorio porque los objetos de transferencia de datos son más flexibles. Puede usarlos en todas partes, sin dependencia de marcos, capas, etc. Representan simplemente el concepto, el modelo. Si quiere un puente entre el modelo y el BD, construye la capa de persistencia. Desea un puente entre el modelo y el usuario que crea la interfaz de usuario. Desea calcular cosas, implementar casos de uso, construir la lógica comercial. Todo se relaciona simplemente con objetos modelo que no están vinculados a nada más que el concepto de negocio en sí. – helios

15

El patrón de repositorio no necesariamente conduce a objetos tontos. Si los objetos no tienen lógica fuera de Guardar/Actualizar, probablemente esté haciendo demasiado fuera del objeto.

Idealmente, nunca debe usar propiedades para obtener datos de su objeto, calcular cosas y colocar datos en el objeto. Esto es una ruptura de la encapsulación.

Por lo tanto, los objetos no deben ser anémicos, excepto si usa objetos DTO simples con operaciones CRUD.

Luego, separar las preocupaciones de persistencia de las preocupaciones de su objeto es una buena manera de tener una sola responsabilidad.

+0

No, seguro - mi busobj no es totalmente "tonto" - Solo quise decir "tonto" porque no saben cómo cargar y guardarse ellos mismos - tienen otra funcionalidad, obviuosly :-) –

+0

Esto es sensato diseño. Personalmente veo que "Bo sabe cargarse a sí mismo" como razón para no contratar a un desarrollador, obviamente nunca escuchó sobre la separación de responsabilidad y nunca ha visto un DAL correctamente encapsulado. – TomTom

+0

¿Has usado CSLA? Funcionó muy bien en un proyecto en el que lo usamos y que implicó una implementación de N niveles. – Fireworks

4

Creo que el efecto secundario más importante del uso del patrón Repositorio frente al patrón ActiveRecord es la prueba y la extensibilidad.

Sin tener su objeto ActiveRecord que contenga un repositorio, ¿cómo aislaría la recuperación de datos en sus casos de prueba? Realmente no puedes fingir o burlarte fácilmente.

Además de las pruebas, también sería mucho más difícil cambiar las tecnologías de acceso a datos, por ejemplo, de Linq-to-SQL a NHibernate o EntityFramework (aunque esto no ocurre a menudo).

1

Realmente depende de las necesidades de la aplicación, pero cuando se trata de un modelo de negocio complejas, yo prefiero ActiveRecord.Puedo encapsular (y probar) la lógica de negocios en un solo lugar.

La mayoría de los ORM (EF, nHibernate, etc ...) sirven como su repositorio. Muchas personas consideran una capa sobre un ORM que encapsula toda la interacción de datos como un repositorio, lo cual creo que es incorrecto. Según Martin Fowler, un Repositorio encapsula el acceso a datos como una colección. Por lo tanto, tener métodos individuales para todas las recuperaciones/mutaciones de datos podría ser utilizar un Data Mapper o un Data Access Object.

Usando ActiveRecord, me gusta tener una clase base "Entity". Normalmente utilizo un ORM (repositorio) con esta clase base, por lo que todas mis entidades tienen los métodos GetById, AsQueryable, Save y Delete.

Si uso más arquitectura orientada a servicios, usaré un repositorio (uno que enmascara el acceso directo a datos o un ORM) y lo llamaré directamente en mis servicios.

Cuestiones relacionadas