2008-08-04 22 views
71

¿Cuál es el consenso sobre cuándo usar una de estas herramientas perjudicada para la otra? Considero que Subsonic es muy útil en términos de hacer las cosas rápidamente, pero en proyectos grandes no tiende a escalar, y vincula su modelo de dominio a su modelo de base de datos. Ahí es donde aparece Nhibernate, ya que le da POCO livianas que no están relacionadas con su modelo de base de datos, pero el tiempo de configuración es mucho más largo.Subsonic Vs NHibernate

Respuesta

4

Creo que casi lo has clavado. Subsonic genera código, por lo que sus objetos comerciales reflejarán la estructura de su base de datos. nHibernate utiliza archivos de mapeo que asignan sus objetos comerciales a la base de datos para que sus objetos se puedan estructurar de la forma que desee.

¿Qué tan grande es este proyecto? ¿Se necesitará apoyo a largo plazo? ¿La rentabilidad de Subsonic va a compensar cualquier posible problema de escalado?

13

Un poco fuera de tema, pero en un sentido similar. ¿Ha mirado Castle ActiveRecord está escrito en la parte superior de NHibernate y elimina la necesidad de perder tiempo creando mapeos XML desde el código a la base de datos. Al igual que NHibernate, puede estructurar los objetos de su dominio como desee y luego generar un esquema de base de datos a partir de esta estructura.

Utilizando ActiveWriter, una herramienta contribuida, puede mapear fácilmente desde su base de datos a objetos de dominio.

+0

Ahora juego con CAR en un proyecto piloto. Lo elijo porque me gusta la idea de ActiveRecord sobre algo tan probado como NHibernate. Si termino no me gusta CAR, puedo recurrir a NHibernate puro. Esto me da una salida segura, me gusta eso. Voy a probar Subsonic en unos pocos meses para comparar. – BuddyJoe

45

Recomendaría SubSonic si su proyecto funciona con la vista ActiveRecord de que la base de datos es su modelo. Obtendrás una clase por mesa y todo funciona mágicamente. Por supuesto, puede modificar y anular las cosas, pero si usted (o su proyecto) está fundamentalmente en desacuerdo con el enfoque de clase por tabla, examinaría NHibernate ya que comienza con el enfoque más complejo (pero más flexible) de mapeo de su modelo de dominio a su base de datos.

Si está utilizando una base de datos relativamente simple que está bajo su control (como en, puede cambiar columnas sin enviar ocho formularios a una junta de revisión de supervisión de división de bases de datos), recomiendo comenzar con SubSonic y pasar a NHibernate si SubSonic no satisface tus necesidades.

3

Hemos bootstrapped con subsónico y ahora estamos tratando de evaluar si vamos a cambiar a nhibernate ahora que estamos en los puntos de dolor de subsónicos.

Nuestra otra opción es crear un término medio donde utilizamos subsónicos para consultar y cargar objetos arbitrarios con su funcionalidad "ejecutar como lista tipeada" que hace un mapeo basado en el nombre de una declaración arbitraria sql style sql. O para tratar de recrear algo en nhibernate y refactorizar el resto.

Así que digo subsónico tiene sentido en aplicaciones pequeñas, pero el mantenimiento en aplicaciones subsónicas se pone bastante peludo, tenemos tiempos especialmente difíciles con el código de validación superpuesto, y pre/post en eventos activados por código. Para un patrón de registro activo, subsónico es definitivamente 80% allí, pero hace algunas cosas de manera escabiosa, y le impide tener un control real sobre su jerarquía de herencia, ya que cada clase debe heredar una tabla para volver a esa tabla.

7

No puedo dar una buena comparación ya que aún no he usado NHibernate en un proyecto, pero he usado SubSonic y he estado muy contento con él. Hasta ahora, no he topado con ningún obstáculo importante al usarlo.

Echa un vistazo this post de Rob Conery, uno de los creadores de SubSonic. Habla sobre cómo desacoplar su código SubSonic del resto de la aplicación. Incluso menciona el hecho de que esta arquitectura le permitirá cambiar posteriormente SubSonic por otra capa de acceso a datos como NHibernate o LINQ to SQL.

Sé que en realidad no respondí su pregunta, pero espero que esto todavía ayude.

83

Me preguntan mucho esta pregunta y realmente todo se reduce a la cantidad que quieres tocar. No puedo decirles cuán dañinos han sido los comentarios de Chris Cyvas sobre el escalamiento RE SubSonic, y he estado respondiendo a estos desde :(.

El trato es - perf-wise, SubSonic escala muy bien. Crecimiento del proyecto: CUALQUIER herramienta que utilice requerirá su atención. Incluso NHibernate.

Escribí una publicación sobre cómo usar el patrón Repository con DI (como lo haría con NHIb o cualquier herramienta para ese asunto) con SubSonic 2.1:

http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/

también escribí un post sobre el rendimiento de subsónica:

http://blog.wekeroad.com/blog/subsonic-scaling/

Espero que esto ayude.

+12

Sesgo o no, he pasado las últimas 4 horas tratando de investigar cuál es más fácil de aprender y trabajar, y la curva de aprendizaje con SubSonic parece muy mínima en comparación con NHibernate ... – RSolberg

+1

Actualmente estoy usando repositorio simple subsónico para un proyecto, es realmente fácil de usar, pero tristemente lento y con errores. después de ver algún código usando profiler aroudn el 20% de tiempo se gastó en obtener valores de la base de datos y el resto en el subsónico mismo. Es por eso que actualmente estoy buscando otras soluciones. –

+0

"Lento y con errores". Es como decir que este comentario es "tonto y no informativo". –

4

De nuevo un poco fuera de tema, pero voy a segundo Castle ActiveRecord - en lugar de usar la base de datos como modelo (enfoque subsónico) o pasar horas en espagueti XML (enfoque NHibernate) simplemente coloca atributos en sus clases modelo.

Incluso puede obtener ActiveRecord a generate the database schema para usted.

Hemos utilizado este enfoque en algunos proyectos bastante ahora y los beneficios son los siguientes:

  • fácil ruta de actualización a NHibernate si es necesario en el futuro
  • Soporte para simple inheritance models - por ejemplo. Coche -> Vehículo
  • El esquema que genera es muy probable que lo haya creado de todos modos, por lo que puede dedicar más tiempo a la creación de la aplicación en lugar de preocuparse por mantener el modelo/base de datos sincronizados.
3

Considere su equipo y el tamaño del proyecto al considerar ActiveRecord.

En mi experiencia, ActiveRecord es una abstracción sobre NHibernate que comienza a filtrarse como un colador cuando se intentan escenarios más complicados.

Si tiene un esquema moderadamente o muy complicado o no sencillo, quédese con NHibernate. Puede cortarlo y cortarlo hasta casi la perfección.

El otro lugar donde puede meterse en problemas es cuando necesita una consulta medianamente complicada. ActiveRecord esconde mucha implementación de NHibernate ... pero la necesitará para una consulta complicada, que será muy difícil si no está familiarizado con HQL. Tenga cuidado con los miembros del equipo que no solo piratean los bordes en lugar de aprender NHibernate y HQL.

7

I wrote a blog post recientemente sobre .NET ORMs que tiene Subssonic en él, y ActiveRecord. Según mi experiencia, depende de lo que esté haciendo el proyecto. Subsonic funciona mucho mejor si proviene de un fondo SQL, pero NHibernate tiene más información sobre él. ActiveRecord es bueno para proyectos más pequeños, no estoy seguro de que sea más rápido para proyectos más grandes que seguir con NHibernate.

+0

El enlace que proporcionó no está funcionando. ¿Quieres decir esto? http://www.shrinkrays.net/articles/a-look-at-dotnet-orms.aspx – kimsk

0

El consejo que he recibido sobre el tema es que Subsonic no escala para manejar escenarios más complejos, por lo que si sigues ese camino terminarás con un trabajo tratando de cambiar a un ORM más avanzado .

Por lo tanto, estoy más interesado en usar NHibernate para casos complejos, Castle Active Record para casos más simples y estoy atento a Fluidez NHibernate que debería hacer que el mapeo NHibernate sea mucho más fácil (especialmente una vez que se mejore el soporte de mapas basado en convenciones) .

+1

"que Subsonic no escala para manejar escenarios más complejos" El problema con esto es que solo decirlo significa nada. Sigue habiendo una falta total de evidencia creíble de que SS no escala. Supongo que es una prueba de que a veces solo decir algo en Internet es suficiente. – CarmineSantini

+0

Si tiene evidencia de problemas de escala subsónica, proporcione. Personalmente, no he experimentado ningún problema con la escalabilidad de SubSonic. –

5

He evaluado ambos y creo que no sería justo recomendar uno sobre el otro sin entender cuáles son sus objetivos. En su pregunta, usted expresó bien las diferencias y creo que ese debe ser su factor decisivo. Personalmente, he usado ambos y continuaré usando ambos dependiendo del proyecto.

  • NHibernate es mi elección para proyectos de mayor escala debido a sus usos de POCO ligeros. Si alguna vez cambiara mi ORM "Creo", sería mucho más fácil refactorizar.
  • SubSonic es mi elección cuando tengo un proyecto de menor escala. Creo que el rendimiento sabio SubSonic escalas bien. Sin embargo, me siento estrechamente unido a él porque está tan grabado en mi proyecto. En proyectos más pequeños, aún puedo desactivarlo porque la base de códigos es muy pequeña y realmente me ayuda a extraer el código como se anuncia.
1

¡Acepta la falta de coincidencia de la impedancia!

check this out

:)

o no hacer. Si quieres rendimiento, hazlo tú mismo. Si lo quiere rápido y fácil, vaya con NHibernate y ActiveRecord. Si te gusta simular que realmente sabes lo que está sucediendo en el nivel de acceso a los datos, utiliza NHibernate y siéntate con XML todo el día para hacer funcionar muchos a muchos ... O simplemente ... err ... hazlo tú mismo - ADO.Net ¡FTW!

+0

Lo mismo Stephen Forte, ahora (desde diciembre de 2010) diciendo "A medida que la generación emergente de herramientas ORM continúa evolucionando, se vuelven más ágiles y fáciles de usar, lo que lleva a más desarrolladores a echar un vistazo a la integración de ORM en su aplicación arquitecturas ". ¡No hay nada como el tiempo para hacer que un hombre recupere el juicio! :-) http://www.devproconnections.com/article/tools-and-products/Repeatable-History-Defying-the-Law-of-Repetitive-Consequences-with-ORM.aspx – rsenna

9

Considere la posibilidad de buscar en Fluent NHibernate; hace que gestionar NHibernate sea muy sencillo. No estoy seguro de lo difícil que sería hacer la transición de un esquema existente, pero si está creando una nueva aplicación, es bueno definir el modelo de dominio y generar la base de datos en prácticamente cualquier servidor de base de datos que se pueda imaginar. Al leer los otros comentarios aquí, creo que Fluent NHibernate trae a NHibernate a la par con SubSonic para facilitar la configuración.

+1

Estoy de acuerdo. La automatización fluida de NHibernate combinada con SchemaExport de NHibernate ofrece todos los beneficios de SubSonic sin ninguno de los inconvenientes. – pondermatic

+0

Fluido NHibernate es genial. – Alex

31

Por lo que vale ... He tenido la oportunidad de usar ambas tecnologías bastante más desde que hice esta pregunta. Y tengo que quedarme, y si estas tecnologías eliges importa muy poco. Seguro NHibernate permite que las entidades comerciales estén un poco menos acopladas a la estructura de su base de datos, pero todavía encuentro que hay muchas ocasiones en las que todavía tiene que ceñirse a la voluntad de la base de datos.

En mi opinión, la única manera verdadera de separar por completo su Modelo de dominio de su modelo de base de datos es escribir su propio DTOS (esencialmente POCO para pasar datos), y luego asignarlos a su ORM de su elección en sus datos capa. Pero en la mayoría de los casos, este enfoque me resultará más complicado de lo que vale.

2

Creo que debe apegarse a uno que puede utilizar mejor. El objetivo final es la productividad y un código de calidad de buen rendimiento. Si conoces SubSonic dentro y fuera, apégate a él y si conoces NHibernate en profundidad, adhiérete a NHibernate. Esta es una pregunta muy subjetiva. También debe considerar el hecho de que los miembros de su equipo tienen experiencia. Si eres bueno en eso, podrás mantenerlo fácilmente.

He visto grandes proyectos usando SubSonic mientras que NHibernate ya es famoso y se usa ampliamente.

La decisión de escoger ORM no se sólo dependerá del propio ORM.

Cuestiones relacionadas