La Couchbase Client Library 1.2-Beta incluye una nueva API para la gestión básica de clusters. Hay métodos para crear, eliminar y listar buckets. Hay métodos similares para gestionar documentos de diseño. Estas nuevas características se encuentran en la nueva clase CouchbaseClusteren virtud de la Couchbase.Management espacio de nombres. La principal ventaja de esta nueva API es que ahora es posible permitir que su aplicación cree su cubo y establezca sus documentos de diseño cuando se inicia.
Una de las sobrecargas para crear nuevos documentos de diseño permite especificar un Corriente como fuente del documento de diseño. Con esta versión, es fácil crear documentos de diseño a partir de un conjunto de archivos. También puede limitarse a especificar una cadena que contenga el documento.
Recientemente tuve la idea de crear una sencilla utilidad de línea de comandos para utilizar estos métodos de gestión de documentos de diseño para automatizar la creación de vistas básicas. El resultado de esta idea está en GitHub en https://github.com/jzablocki/couchbase-model-views. Utilizando este marco, podrá automatizar la creación de vistas simplemente decorando sus clases modelo existentes con atributos personalizados.
Considere la posibilidad de Cerveza con propiedades para Nombre, Descripción, Cervecería y ABV.
público clase Cerveza
{
público cadena Id { consiga; configure; }
público cadena Nombre { consiga; configure; }
público cadena Descripción { consiga; configure; }
público float ABV { consiga; configure; }
público cadena Cervecería { consiga; configure; }
}
Esta clase mapea a documentos "cerveza" en su cubo Couchbase.
"nombre": "Samuel Adams Summer Ale",
"abv": 5.2,
"tipo": "cerveza",
"cervecería_id": "110f04db06",
"descripción": "Brillante y cítrica, elaborada con misteriosos granos de...
}
Para lograr esta asignación, es probable que utilice Newtonsoft.Jsonatributos de asignación de propiedades.
público clase Cerveza
{
público cadena Id { consiga; configure; }
[JsonProperty("nombre")]
público cadena Nombre { consiga; configure; }
[JsonProperty("descripción")]
público cadena Descripción { consiga; configure; }
[JsonProperty("abv")]
público float ABV { consiga; configure; }
[JsonProperty("breweryId")]
público cadena Cervecería { consiga; configure; }
}
Utilizando dos nuevos atributos encontrados en el CouchbaseModelViews.Framework puedes decorar esta clase para declarar qué propiedades de esta clase deben ser indexadas por Couchbase Server. Estos atributos son CouchbaseDiseñoDocumento y CouchbaseViewKey.
[CouchbaseDesignDoc("cervezas", "cerveza")]
público clase Cerveza
{
público cadena Id { consiga; configure; }
[JsonProperty("nombre")]
[CouchbaseViewKey("por_abv_y_nombre", "nombre", 1)]
[CouchbaseViewKey("by_name", "nombre")]
público cadena Nombre { consiga; configure; }
[JsonProperty("descripción")]
público cadena Descripción { consiga; configure; }
[JsonProperty("abv")]
[CouchbaseViewKey("por_abv_y_nombre", "abv", 0)]
público float ABV { consiga; configure; }
[JsonProperty("breweryId")]
[CouchbaseViewKey("by_brewery", "breweryId")]
público cadena Cervecería { consiga; configure; }
}
En CouchbaseDesignDoc en una clase modelo. Para definir un documento de diseño se utiliza un objeto CLR antiguo (POCO). Si omite el argumento name, se creará un documento de diseño con el mismo nombre (en minúsculas) que la clase. Si omite el argumento type, views comprobará que los documentos tienen una propiedad type con el valor del nombre (en minúsculas) de la clase.
En CouchbaseViewKey en las propiedades de una clase POCO que deben ser indexadas. Por ejemplo, la propiedad Name de la clase Cerveza tiene una clase CouchbaseViewKey con los argumentos "by_name" y "name". La vista que resultará de estos valores es la siguiente:
si (doc.tipo == "cerveza" && doc.nombre) {
emite(doc.nombre, null);
}
}
El argumento "by_name" es el nombre de esta vista y el argumento "name" define qué propiedad se comprueba si existe y se emite.
También es posible incluir claves compuestas decorando varias propiedades con CouchbaseViewKey que contengan el mismo valor para el parámetro viewName. Las claves compuestas se demuestran con "by_abv_and_name" en las propiedades ABV y Name. Observe también que existe un parámetro de orden opcional que permite establecer el orden en que se emiten las propiedades.
si (doc.tipo == "cerveza" && doc.abv && doc.nombre) {
emite([doc.abv, doc.nombre], null);
}
}
Una vez que haya decorado su clase con los atributos apropiados, puede utilizar la función CouchbaseModelViewsGenerator para ejecutar los modelos a través del generador de vistas. Se trata de un sencillo proyecto de línea de comandos que requiere un app.config con una sección que enumere todos los ensamblados que contienen modelos que se utilizarán para crear vistas.
<grupo de secciones nombre="modelViews">
<sección nombre="asambleas" tipo="System.Configuration.DictionarySectionHandler"/>
>
<modelViews>
<ensamblajes>
<añadir clave="DemoModels" valor="CouchbaseModelViews.DemoModels" />
>
>
Además, tendrá que configurar el CouchbaseCluster. CouchbaseCluster instancias se crean utilizando la misma configuración (código o app.config) que la existente CouchbaseClient. Sin embargo, ahora hay dos propiedades adicionales que puede configurar para proporcionar las credenciales de administrador.
<servidores cubo="por defecto" bucketPassword=“” nombre de usuario="Administrador" contraseña="qwerty">
<añadir uri="http://localhost:8091/pools" />
>
>
Una vez que hayas configurado tu app.config, asegúrate de que tienes los ensamblados listados en el directorio bin donde pueden ser cargados. La forma más fácil de conseguir esta capacidad de descubrimiento es, por supuesto, hacer referencia a ellos. Sin embargo, si sólo quieres usar una versión compilada de la aplicación de consola, simplemente cópialos en el directorio bin.
Cuando se ejecute, el marco creará un documento de diseño de "cervezas" con el siguiente aspecto:
"vistas": {
"por_abv_y_nombre": {
"mapa": " function(doc, meta) { rnt if (doc.type == “cerveza“ && doc.abv && doc.name) { rntt emit([doc.abv, doc.name], null); rnt } rn }”
},
"by_name": {
"mapa": " function(doc, meta) { rnt if (doc.type == “cerveza“ && doc.name) { rntt emit(doc.name, null); rnt } rn }”
},
"by_brewery": {
"mapa": " function(doc, meta) { rnt if (doc.type == “cerveza“ && doc.breweryId) { rntt emit(doc.breweryId, null); rnt } rn }”
}
}
}
La consola no contiene ninguna lógica de creación de vistas. Se limita a orquestar las llamadas a los distintos componentes de fontanería dentro de la aplicación Marco proyecto. Si prefieres incluir la creación de la vista dentro de Global.asax o algún otro evento de inicio de la aplicación, puedes hacer estas llamadas tú mismo. Hay cuatro componentes principales del framework.
- En ConfigParser simplemente lee la lista de ensamblados de la sección config y genera una lista enumerable de ensamblados.
- En ViewBuilder toma un conjunto o una lista enumerable de conjuntos e itera sobre cada uno de los tipos. Para cada tipo encontrado con un CouchbaseDesignDoc se construyen las vistas. La dirección Construya método del ViewBuilder devuelve un diccionario, donde las claves son los nombres de los documentos de diseño y los valores son los documentos de diseño reales.
- En DesignDocManager toma un diccionario con el nombre del documento, los pares de documentos de diseño y utiliza la función CouchbaseCluster para crear documentos de diseño.
- También hay un ViewRunner que ejecutará las vistas recién creadas.
var constructor = nuevo ViewBuilder();
constructor.AñadirAsambleas(montajes.ToList());
var diseñoDocs = constructor.Construya();
var ddManager = nuevo DesignDocManager();
ddManager.Cree(designDocs, (s) => Consola.WriteLine("Creado {0} diseño doc", s));
var corredor = nuevo ViewRunner();
corredor.Ejecutar(designDocs, (k, v, s) => Consola.WriteLine("[{0}::{1}] Tecla {2}"k, v, s["llave"]), 5);
No hay acoplamiento entre ninguno de estos tres componentes y puede utilizarlos como desee. Si, por ejemplo, dispone de su propia herramienta de recopilación de montajes, simplemente pásela al componente ViewBuilder.Build para renderizar el JSON necesario para crear las vistas.
En este punto, el framework está casi completo y razonablemente probado. El código tiene algunos bucles más de lo que me gustaría y puede que haya usado Tuples en exceso, pero funciona. Siéntete libre de usarlo en tus proyectos. Ten en cuenta que es un proyecto de Couchbase Labs y no está soportado oficialmente. Recuerda también que está usando la versión Beta de la librería .NET Couchbase Client Library y que la API está sujeta a cambios.
No entiendo el concepto. Cómo guardo la nueva vista (documento de diseño de couchbase) en couchbase?
Hola Sam,
Las nuevas vistas se guardan cuando ejecutas el código de abajo (de arriba). Básicamente, sólo tienes que pasar al ViewBuilder un ensamblado que contenga clases marcadas con los nuevos atributos de Couchbase. Cuando llames a Create en el DesignDocManager, creará las vistas.
var assemblies = ConfigParser.GetAssemblies();
var builder = new ViewBuilder();
builder.AddAssemblies(assemblies.ToList());
var diseñoDocs = constructor.Build();
var ddManager = nuevo DesignDocManager();
ddManager.Create(diseñoDocs);
¿qué pasa con la conexión al servidor couchbase y guardar este documento de diseño allí? Eso es lo que estoy confundido ... ¿No deberíamos estar guardando esto en el servidor couchbase?
¿Ddmanager guarda la vista en couchbase? Lo que no entiendo. Es... ¿Qué relación tiene este código con la db? ¿Cómo y dónde se guarda la vista en el cubo?
¿Hay alguna forma de pasar las instancias de conexión y de objeto cliente a través de código en lugar de utilizar el archivo de configuración al guardar el documento de diseño?
Le agradecería que me ayudara. He intentado su código como este :
objAssemblies.Add(System.Reflection.Assembly.GetAssembly(typeof(myclass))); //myclass tiene todas las propiedades decoradas con atributos
builder.AddAssemblies(objAssemblies);
var diseñoDocs = constructor.Build();
var ddManager = nuevo DesignDocManager();
ddManager.Create(diseñoDocs);
Pero no funciona
Quiero ser capaz de utilizar el GetView. Siempre me da un 404. He intentado marcar todas mis clases modelo con CouchbaseDesignDoc y almacenarlas en couchbase pero no parece funcionar si utilizo GetView...por favor ayuda....
Hola Matt,
¿Ha comprobado que las vistas se crean en el servidor después de ejecutar el fragmento de código ViewBuilder/DesignDocManager anterior?
- Juan
Voy a hacer una demostración de este proyecto en nuestro Google Hangout esta tarde (sigue a Couchbase en Google+ para más información). Publicaré un enlace aquí después.
Niza, pero también me gustaría ver una manera de \ "fluently\" diseñar los documentos similares a FluentNHibernate en lugar de documentos de diseño basado en atributos.