65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (16投票s)

2012年6月17日

CPOL

4分钟阅读

viewsIcon

82806

downloadIcon

3656

如何使用 MVVM 模式、WCF 和实体框架创建一个简单的 Silverlight 应用程序。

引言

在本文中,我们将介绍如何使用 MVVM、WCF 服务和实体框架开发一个简单的 Silverlight 应用程序。在我之前的文章中,我介绍了如何使用 MVVM 模式开发一个简单的 Silverlight 应用程序(文章链接)。在本文中,我们将学习如何创建一个包含 WCF 服务的 Silverlight 应用程序。

步骤

  1. 添加一个新的 Silverlight 项目。
  2. 创建一个类型为类库的项目用于 Model。
  3. 添加一个 WCF 服务项目。
  4. 配置服务。
  5. 向 Silverlight 项目添加服务引用。
  6. 添加跨域策略。
  7. 运行并调试应用程序。

添加一个新的 Silverlight 项目

  1. 创建一个新的 Silverlight 项目,如下所示
  2. 选择“宿主应用程序与网站”。这将包含一个 ASPX 项目,我们可以用它来宿主 Silverlight 对象。
  3. 现在解决方案中将创建两个项目:Silverlight 和 Web 项目。

创建 Model 项目

  1. 向解决方案添加一个类库项目。
  2. 向项目中添加一个 .edmx 文件。
  3. 现在选择要导入的数据源和表。
  4. 我将向我的实体模型添加一个 schoolclass 表。
  5. 现在您可以在 Model 项目下的解决方案中看到 Model1.edmx,并在 Model1.edmx 中看到 schoolclass 实体。

添加 WCF 服务项目

  1. 现在向我们的解决方案添加一个 WCF 项目。
  2. 现在已添加服务。您可以看到 Iservice1Service.svcservice.svc.cs
  3. 现在我将在服务中编写两个方法。一个用于获取班级名称,另一个用于获取学校班级详细信息。
  4. [OperationContract]
    List<string> GetClasses();
  5. 现在在 service1.svc.cs 中实现这些方法。
  6. 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();
    }
  7. 现在您可以看到我们遇到了错误,这是因为我们忘记在此处添加 Model 项目的引用。所以添加对 Model 的引用并在 .cs 文件中包含它。

配置服务

  1. 正确配置服务是关键。如果我们配置不当,最终会遇到各种错误,并且很难找出问题所在。
  2. 我们需要配置的第一个项目是连接字符串。复制在 Model 项目中用 edmx 创建的连接字符串。在这里您可以配置不同的数据库和服务器。服务器和数据库的详细信息不需要与 edmx 配置和服务配置相同。
  3. 我们需要配置服务。在 system.servicemodel 标记内添加以下服务详细信息。这里的 contract name 应该是带有命名空间的服务的接口。
  4. <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>
  5. 这样,我们就完成了 Model 和服务的添加。接下来,我们必须将此服务作为引用添加到 Silverlight 项目中。在添加此服务作为引用之前,我们必须构建项目。
  6. 因此,当我构建服务时,会收到以下错误。这是因为我们忘记添加 System.Data.Entity 作为引用。

向 Silverlight 添加服务引用

  1. 这是最容易做的事情。转到 Silverlight 项目,右键单击“引用”,然后单击“添加服务引用”。
  2. 我们的服务在同一个项目中,所以除了输入服务地址,我还可以点击“发现”,这样 Visual Studio 就会在同一个解决方案中找到服务。
  3. 现在用您想要的名称更新命名空间字段,然后单击“确定”。
  4. 现在您可以看到我们的服务引用已添加,并且还添加了 client.config 文件。这将是服务引用的客户端配置。

设置 Silverlight 项目

视图和 ViewModel

我创建了包含 ListBoxGridView 的 View。ListBox 用于显示班级名称,而 school class 用于显示学校班级的全部详细信息。我们在这篇文章中已经了解了视图和视图模型。这里我们主要讨论在 ViewModel 中使用服务引用。

在 ViewModel 的构造函数中,为服务引用添加一个服务客户端。由于我们希望在页面加载时就加载 ListBoxGridView,所以我们也可以调用服务引用方法。在回调事件中,将属性分配给 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 应用程序。有关完整的源代码,请查找附件。

请留下您宝贵的意见以改进本文,如果您觉得有用,请不要忘记给本文评分。

© . All rights reserved.