Silverlight 应用程序,使用 MVVM WCF 和 EF






3.82/5 (16投票s)
如何使用 MVVM 模式、WCF 和实体框架创建一个简单的 Silverlight 应用程序。
引言
在本文中,我们将介绍如何使用 MVVM、WCF 服务和实体框架开发一个简单的 Silverlight 应用程序。在我之前的文章中,我介绍了如何使用 MVVM 模式开发一个简单的 Silverlight 应用程序(文章链接)。在本文中,我们将学习如何创建一个包含 WCF 服务的 Silverlight 应用程序。
步骤
- 添加一个新的 Silverlight 项目。
- 创建一个类型为类库的项目用于 Model。
- 添加一个 WCF 服务项目。
- 配置服务。
- 向 Silverlight 项目添加服务引用。
- 添加跨域策略。
- 运行并调试应用程序。
添加一个新的 Silverlight 项目
- 创建一个新的 Silverlight 项目,如下所示
- 选择“宿主应用程序与网站”。这将包含一个 ASPX 项目,我们可以用它来宿主 Silverlight 对象。
- 现在解决方案中将创建两个项目:Silverlight 和 Web 项目。
创建 Model 项目
- 向解决方案添加一个类库项目。
- 向项目中添加一个 .edmx 文件。
- 现在选择要导入的数据源和表。
- 我将向我的实体模型添加一个 schoolclass 表。
- 现在您可以在 Model 项目下的解决方案中看到 Model1.edmx,并在 Model1.edmx 中看到 schoolclass 实体。
添加 WCF 服务项目
- 现在向我们的解决方案添加一个 WCF 项目。
- 现在已添加服务。您可以看到
Iservice1
、Service.svc 和 service.svc.cs。 - 现在我将在服务中编写两个方法。一个用于获取班级名称,另一个用于获取学校班级详细信息。
- 现在在 service1.svc.cs 中实现这些方法。
- 现在您可以看到我们遇到了错误,这是因为我们忘记在此处添加 Model 项目的引用。所以添加对 Model 的引用并在 .cs 文件中包含它。
[OperationContract]
List<string> GetClasses();
public List<string> GetClasses()
{
SanthoshEntities entity = new SanthoshEntities();
List<SchoolClass> list = entity.SchoolClasses.ToList();
return list.Select(m => m.Name).ToList();
}
public List<SchoolClass> GetSchoolClasses()
{
SanthoshEntities entity = new SanthoshEntities();
return entity.SchoolClasses.ToList();
}
配置服务
- 正确配置服务是关键。如果我们配置不当,最终会遇到各种错误,并且很难找出问题所在。
- 我们需要配置的第一个项目是连接字符串。复制在 Model 项目中用 edmx 创建的连接字符串。在这里您可以配置不同的数据库和服务器。服务器和数据库的详细信息不需要与 edmx 配置和服务配置相同。
- 我们需要配置服务。在
system.servicemodel
标记内添加以下服务详细信息。这里的 contract name 应该是带有命名空间的服务的接口。 - 这样,我们就完成了 Model 和服务的添加。接下来,我们必须将此服务作为引用添加到 Silverlight 项目中。在添加此服务作为引用之前,我们必须构建项目。
- 因此,当我构建服务时,会收到以下错误。这是因为我们忘记添加
System.Data.Entity
作为引用。
<services>
<service name="WcfService.Service1">
<endpoint address="" binding="basicHttpBinding" contract="WcfService.IService1" >
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
向 Silverlight 添加服务引用
- 这是最容易做的事情。转到 Silverlight 项目,右键单击“引用”,然后单击“添加服务引用”。
- 我们的服务在同一个项目中,所以除了输入服务地址,我还可以点击“发现”,这样 Visual Studio 就会在同一个解决方案中找到服务。
- 现在用您想要的名称更新命名空间字段,然后单击“确定”。
- 现在您可以看到我们的服务引用已添加,并且还添加了 client.config 文件。这将是服务引用的客户端配置。
设置 Silverlight 项目
视图和 ViewModel
我创建了包含 ListBox
和 GridView
的 View。ListBox
用于显示班级名称,而 school class 用于显示学校班级的全部详细信息。我们在这篇文章中已经了解了视图和视图模型。这里我们主要讨论在 ViewModel 中使用服务引用。
在 ViewModel 的构造函数中,为服务引用添加一个服务客户端。由于我们希望在页面加载时就加载 ListBox
和 GridView
,所以我们也可以调用服务引用方法。在回调事件中,将属性分配给 Result
方法。
public MainViewModel()
{
MyServiceReference.Service1Client client = new MyServiceReference.Service1Client();
client.GetClassesCompleted +=
new EventHandler<MyServiceReference.GetClassesCompletedEventArgs>(client_GetClassesCompleted);
client.GetClassesAsync();
client.GetSchoolClassesCompleted +=
new EventHandler<GetSchoolClassesCompletedEventArgs>(client_GetSchoolClassesCompleted);
client.GetSchoolClassesAsync();
}
void client_GetSchoolClassesCompleted(object sender, GetSchoolClassesCompletedEventArgs e)
{
SchoolClasses = e.Result;
}
void client_GetClassesCompleted(object sender, MyServiceReference.GetClassesCompletedEventArgs e)
{
Classes = e.Result;
}
有关完整的视图和 ViewModel 代码,请参阅附件的解决方案。
现在调试应用程序。它将向我们显示 CommunicationException
错误。这是由于跨域违规造成的。当服务位于其他项目中时,我们必须添加 clientaccesspolicy.xml 文件。要了解更多关于跨域边界的信息,请参阅此 Microsoft 链接
添加一个新的 XML 文件并添加以下代码。现在运行应用程序。
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="SOAPAction">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
结论
在本文中,我们介绍了如何使用 MVVM 模式、WCF 和实体框架创建一个简单的 Silverlight 应用程序。有关完整的源代码,请查找附件。
请留下您宝贵的意见以改进本文,如果您觉得有用,请不要忘记给本文评分。