pattern net mvc generic cache data-structures architecture repository-pattern

data structures - net - Patrón de repositorio frente a objetos comerciales "inteligentes"



repository pattern obsolete (5)

Aquí hay dos artículos interesantes que encontré

Repository-is-the-new-singleton

El DAL debe llegar hasta UI

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).

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, por ejemplo, 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 a sí mismos, 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 usas o prefieres? ¿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í, solo tratando de descubrir qué piensan todos sobre esto y cuál es su opinión, y por qué usan uno (o ambos) patrones sobre el otro.

¡Gracias por cualquier aporte constructivo!


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 los datos, por ejemplo, de Linq-a-SQL a NHibernate o EntityFramework (aunque esto no ocurre con frecuencia).


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 volver a 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.


Realmente depende de las necesidades de la aplicación, pero cuando se trata de un modelo de negocio complejo, 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 una 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.


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 y eliminarse, cuando esto puede ser manejado por un único repositorio genérico