Una vez comencé un proyecto MVVM / WPF, que finalmente se construyó e implementó, y para eso estudié mucho el Marco Caliburn.Micro MVVM. El hecho es: terminé no usando Caliburn.Micro para eso, y terminé implementando algunos conceptos MVVM (específicamente, solo las clases ViewModelBase
y RoutedCommand
).
Ahora me asignaron a un proyecto algo más grande en la misma línea: una "Aplicación de escritorio fuera de línea de cliente enriquecido para un solo usuario", por así decirlo, y decidí usar Caliburn.Micro. Y ahí es donde comienza mi "problema".
He leído en esta famosa publicación de blog , cuyo título dice que "si estás usando MVVM, entonces necesitas un marco", que:
"Tratar de hacer algo como MVVM sin un marco es una gran cantidad de trabajo. Toneladas de código duplicado, reinventar la rueda y volver a capacitar a las personas para que piensen de manera diferente" .
Al menos con un marco de trabajo, evita el código duplicado y, con suerte, no tendrá que reinventar la rueda, lo que le permite concentrarse en volver a capacitar a las personas. La parte de reentrenamiento es generalmente inevitable, pero un marco proporciona código y estructura de plomería, lo que facilita el proceso. "
Estaría de acuerdo con la primera lectura, pero mi experiencia real con Caliburn.Micro (CM) en mi aplicación actual es de falta de idea y desorientación. Es decir, el marco no facilitó el proceso en absoluto, sino todo lo contrario. Leyendo los ejemplos siempre repetidos proporcionados por Rob Eisenberg en la documentación informal (demasiado), e intentando inferir patrones de uso a partir de las muestras proporcionadas enrevesadas, y sus relaciones de clase e interfaz completamente indirectas, donde las cosas parecen estar diseñadas para funcionar en función de efectos secundarios, parece humanamente imposible a menos que seas un genio experimentado (perdón por la queja, pero supongo que sabes a lo que me refiero).
Sin mencionar que cualquier escenario anterior trivial parece involucrar contenedores IoC, que es algo con lo que nunca he trabajado, y que parecen resolver un problema que ni siquiera podría tener . No tengo ganas de pasar más horas del proyecto aprendiendo esas cosas en lugar de pensar en mis problemas y dominios de aplicación. Solo quería un plátano, pero CM me dio un gorila (IoC) sosteniendo una canasta de plátanos.
Ahora que estoy considerando volver a mi marco MVVM casero, compuesto solo por el puñado de clases específicas de MVVM que realmente quiero implementar, me gustaría al menos darle una oportunidad a CM, en caso de que esté perdiendo algo aquí, o simplemente haciendo las cosas "al revés" por pura inexperiencia e ignorancia. Y entonces la pregunta es:
Existe un consenso generalizado de que "los marcos hacen las cosas más fáciles y más naturales", pero si estoy experimentando todo lo contrario, ¿significa esto que no debería usar el marco o que estoy tratando de aprenderlo de manera incorrecta? ¿Hay alguna pista de que ni siquiera debería estar usando un marco en primer lugar? ¿O hay alguna forma "correcta" de descubrir cómo usar CM para el desarrollo simple de MVVM?
fuente
EventAggregator
para mensajes, yNotificationObject
para ViewModelBase, y MVVM LightRelayCommand
para comandos. Lo importante es identificar qué problemas resolverá el marco para usted y solo usar esas soluciones. No sienta que está obligado a usar toda la biblioteca de framework.RelayCommand
implementación (ya que "se une" directamente a los métodos por convención, en lugar de vincularse a las propiedades de ICommand).RelayCommand
de otra biblioteca si la utilizada por Caliburn Micro no funciona para usted.Respuestas:
He intentado CaliburnMicro y MVVMLight y cuando uso Caliburn realmente siento lo que sientes, seguro que se siente realmente mágico poder vincular el control a la propiedad simplemente usando Name = "PropertyName" en lugar del antiguo Text = "{Bind PropertyName}" pero en el fin Caliburn se va por la borda para hacer esta cosa mágica, cuando algo sale mal es realmente difícil de depurar, para empeorar las cosas, tienen muchas maneras de hacer una cosa.
Pero cuando usa MVVMLight es delgado, cuando lo usa, probablemente se dé cuenta de que es casi 100% como su MVVM Framework, con algunas características rociadas.
Sé que esto no responde a su pregunta "Cómo NO usar el marco", pero, francamente, no puedo recomendarle que siga esa ruta porque simplemente está mal, también creo que está perdido porque usa el marco con todas las funciones en lugar de usar un simple uno primero.
fuente
Es importante darse cuenta de lo que es MVVM. No es un poco de funcionalidad compartida lo que no tiene que volver a implementar (analizar un archivo JPEG o conectarse a un servidor de base de datos SQL dado), es un patrón, un patrón de cómo uno puede elegir implementar una GUI enriquecida. Entonces, si su implementación del patrón es simple y directa, no creo que necesite sentir vergüenza al usarlo en lugar de un marco.
De hecho, creo que toda la idea de patrones como marcos ha ido demasiado lejos. Para que cualquier cosa sea un patrón, tiene que ser la forma general de una clase de soluciones. Como esto es así, es de esperar que los patrones deban adaptarse a los sistemas que los usan y no puede hacerlo si intenta usar un patrón de talla única. Sería mucho más constructivo dejar la implementación del patrón al diseñador de la aplicación y proporcionar bibliotecas que encapsulan la funcionalidad, en lugar de la arquitectura.
fuente
DataContext
etc.Mi primera experiencia con WPF ha sido usar Caliburn.Micro, por lo que probablemente sea bastante diferente de la mayoría de los desarrolladores. He encontrado que tanto WPF como Caliburn.Micro son una curva de aprendizaje bastante empinada, proveniente de WinForms, sin embargo, después de un poco de experiencia con ambos, me ha parecido un placer usarlos como pareja. Actualmente trabajando en una organización diferente donde no se usa Caliburn.Micro, encuentro que hay MUCHO código de plomería duplicado que hace que la base de código esté bastante hinchada e innecesariamente compleja.
Definitivamente estoy de acuerdo en que hay algunos problemas con Caliburn.Micro, que pueden complicar la depuración, sin embargo, una vez experimentados, es mucho menos probable que vuelvan a ser un dolor. La mayor velocidad de desarrollo, el código más limpio y ágil y el marco general que fomenta un mejor MVVM merecen la pena.
Caliburn.Micro tampoco invalida el stock WPF, solo se acumula sobre él, lo que significa que aún puede usar las funciones de WPF si lo desea y usar Caliburn para algunos bits si lo desea. Esto es similar a cómo TypeScript y JavaScript coexisten en mi mente.
Definitivamente usaría Caliburn.Micro en cualquier nuevo proyecto de WPF en el que trabaje en el futuro si tuviera la oportunidad.
fuente
Para cualquiera que llegue aquí por frustración con Caliburn.Micro, eche un vistazo a este marco: Stylet
Está inspirado en Caliburn.Micro, excepto que elimina mucha de la magia que te deja desorientado sobre lo que está sucediendo. Además, la documentación está escrita en un lenguaje mucho más claro sin suponer que desea pasar por la jerga técnica. Mucho mejor para principiantes.
Además, Stylet adopta un enfoque ViewModel-First. Caliburn.Micro y muchos otros frameworks adoptan un enfoque View-First, que viene con algunos problemas incómodos. Si ya es muy bueno con los principios SÓLIDOS y el código modelado, es probable que encuentre un enfoque ViewModel-First más natural, ya que toma la perspectiva de que su lógica debe conducir el sistema, no la vista.
fuente