The WCF RIA Services class library enables you to create reusable middle-tier and presentation-tier logic. However, using the RIA Services class library is more complicated than creating a RIA Services solution. If you do not have to create reusable components or you want to see a more introductory walkthrough about creating a RIA Services solution, see Walkthrough: Creating a RIA Services Solution. For more information about the RIA Services class library, see Working with RIA Services Solutions.
In this walkthrough, you will learn how to create a Silverlight application that includes code in a RIA Services class library. To simplify the example, this walkthrough shows the class library in the same solution as the Silverlight application. The class library can exist in a separate solution.
To create a Silverlight solution that contains a WCF RIA Services class library
-
In Visual Studio, create a new Silverlight Application named ExampleSilverlightApp.
-
In the New Silverlight Application dialog box, do not enable WCF RIA Services for the application.
The Silverlight application does not need a RIA Services link between the Silverlight project and the server project because the RIA Services link will exist between the projects in the class library.
-
In Solution Explorer, right-click the solution, select Add, and then select New Project.
The Add New Project dialog box appears.
-
In the Silverlight category, select the WCF RIA Services Class Library template and name it AdventureWorksClassLibrary.
-
Click OK.
Your solution now contains four projects as shown in the following illustration.
-
Right-click the ExampleSilverlightApp.Web project and select Add Reference.
The Add Reference dialog box appears.
-
On the Projects tab, select the AdventureWorksClassLibrary.Web project and click OK.
-
Right-click the ExampleSilverlightApp project and select Add Reference.
-
On the Projects tab, select the AdventureWorksClassLibrary project and click OK.
To create the middle-tier library
-
In the AdventureWorksClassLibrary.Web project, add an ADO.NET Entity Data Model named AdventureWorksModel.edmx. For steps on how to do this, see Walkthrough: Creating a RIA Services Solution.
-
In the Entity Data Model Wizard, include the Product table in the entity model.
-
Build the solution.
-
Right-click the AdventureWorksClassLibrary.Web project, select Add, and then select New Item.
-
Select the Domain Service Class template and name it ProductsDomainService.
-
Click Add.
The Add New Domain Service Class dialog box appears.
-
Select Product from the available data models to expose through the domain service and click OK.
-
Build the solution.
-
In Solution Explorer, select Show All Files in each project.
Notice the Generated_Code folder only exists in the AdventureWorksClassLibrary project. Although no code was generated for the ExampleSilverlightApp project, you can still use the generated code from the AdventureWorksClassLibrary project because a project reference exists between the ExampleSilverlightApp and AdventureWorksClassLibrary projects.
To use the generated code in the Silverlight project
-
Right-click the ExampleSilverlightApp project and select Add Reference.
-
Add a reference to the System.ServiceModel.DomainServices.Client assembly.
To find the assembly, browse to [Program Files]\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight
-
In the ExampleSilverlightApp project, open the MainPage.xaml.
-
From the Toolbox, drag a DataGrid control to within the Grid element.
An XML namespace and references to Data assemblies are added.
-
Name the DataGridProductsGrid, as shown in the following XAML.
<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="ExampleSilverlightApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <data:DataGrid Name="ProductsGrid"></data:DataGrid> </Grid> </UserControl>
-
Open the code-behind for MainPage.xaml.
-
Add the following code to retrieve the products.
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.ServiceModel.DomainServices.Client; using AdventureWorksClassLibrary.Web; namespace RIAServicesExample { public partial class MainPage : UserControl { private ProductsDomainContext _productContext = new ProductsDomainContext(); public MainPage() { InitializeComponent(); LoadOperation<Product> loadOp = this._productContext.Load(this._productContext.GetProductsQuery()); ProductsGrid.ItemsSource = loadOp.Entities; } } }
-
Open the App.Config file in the AdventureWorksClassLibrary.Web project, and copy individually the <connectionStrings>, <system.serviceModel>, and <httpModules> elements and the elements they contain. Paste each element individually into the Web.config file of the ExampleSilverlightApp.Web project. The Web.config file will look similar to the following example, but your file must provide the relevant connection information for your environment.
<configuration> <connectionStrings> <add name="AdventureWorksLT2008Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="Data Source=example;Initial Catalog=AdventureWorksLT2008;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" /> </connectionStrings> <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpModules> <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </httpModules> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
-
Run the application.