Silverlight: Propiedades de metadatos personalizados para DomainService
Introducción
Esta entrada simplemente demuestra cómo agregar una propiedad personalizada en los metadatos generados por el DomainService metadata.Muchas veces, sobre todo cuando trabajamos con el ADO.NET Entity Framework, necesitamos agregar algunas propiedades adicionales en nuestro metadatos generados, por ejemplo, cuando debemos calcular algo o concatenar algunas cadenas de caracteres.
Primeros pasos
En este caso, debemos crear una aplicación de tipo 'Aplicación de negocios Silverlight'. Así que, utilizaremos el 'Proyecto Web ASP.NET', Luego de eso, necesitamos crear un archivo de base de datos con dos tablas (de manera a probar la teoría). Lo haríamos de la siguiente manera:Es aquí, donde crearemos nuestro ADO.NET Entity Data Model, la clase Domain Service y los metadatos para dicha clase. De esta manera, la estructura de la 'Aplicación Web ASP.NET' quedará de la siguiente manera:
En la clase de servicio 'DomainService1.metadata.cs', deberíamos reemplazar la implementacion del método GetCities(). Entonces, agregamos estas líneas de código:
public IQueryableGetCities() { return this.ObjectContext.Cities.Include("Country").OrderBy(c=>c.CityName); }
Muy bien, con estos pasos tendremos listo nuestro Domain Service listo.
Utilizando el código
Ahora, en nuestro proyecto Silverlight, expandimos Views/Home.xaml y lo abrimos. En el código XAML ingresamos las siguientes líneas:<navigation:Page.Resources> <riacontrols:DomainDataSource x:Key="cityDDS" AutoLoad="True" QueryName="GetCities" > <riacontrols:DomainDataSource.DomainContext> <data:DomainService1 /> </riacontrols:DomainDataSource.DomainContext> </riacontrols:DomainDataSource> </navigation:Page.Resources> <sdk:DataGrid Grid.Row="0" AutoGenerateColumns="False" Margin="10" ItemsSource="{Binding Source={StaticResource cityDDS}, Path=Data}"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="CityID" Binding="{Binding CityID}" /> <sdk:DataGridTextColumn Header="City Name" Binding="{Binding CityName}" /> <sdk:DataGridTextColumn Header="Country Name" Binding="{Binding Country.CountryName}" /> <sdk:DataGridTextColumn Header="CountryID" Binding="{Binding Country.CountryID}" /> </sdk:DataGrid.Columns> </sdk:DataGrid>
Ahora agregaremos la extensión, que permitirá agregar las propiedades personalizadas a los metadatos generados anteriormente. Agregamos la clase DomainService1.metadata.partial.cs de la siguiente manera:
En el código anterior, seguramente has notado que agregamos la palabra clave partial a la clase. Con dicha palabra clave (en ambos archivos del DomainService.metadata) compartimos las propiedades existentes en la clase metadata que ha sido generada de forma automática por el ADO.NET Entity Framework.
using System.Runtime.Serialization; namespace MetadataExtension.Web { public partial class City { [DataMember] public string CityData { get { return this.CityID.ToString() + " - " + this.CityName;} } } public partial class Country { [DataMember] public string CountryData { get { return this.CountryID.ToString() + " - " + this.CountryName;} } } }
Necesitamos compilar nuestro proyecto web ASP.NET y no encontrarnos con ningún error.
Volviendo al proyecto Silverlight, específicamente en el archivo Home.xaml, agregamos las siguientes líneas de código:
<sdk:DataGrid Grid.Row="1" AutoGenerateColumns="False" Margin="10" ItemsSource="{Binding Source={StaticResource cityDDS}, Path=Data}"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="CityID" Binding="{Binding CityData}" /> <sdk:DataGridTextColumn Header="Country Name" Binding="{Binding Country.CountryData}" /> </sdk:DataGrid.Columns> </sdk:DataGrid>Luego de estos pasos, podemos Ejecutar el proyecto (F5) y veremos el resultado que buscamos.