top-silverlight | Just another WordPress weblog

五/09

12

SharePoint 2007与WCF和Silverlight

 

  本文将说明一个构建Silverlight前端到SharePoint功能的例子。Silverlight控制将在SharePoint背景中工作,而且让你从受限的Silverlight CLR中访问SharePoint对象模式。整篇文章中,我将说明具体的开发步骤——是让在SharePoint中的Rich UIs开发变得很简单的步骤。让我们首先从定义问题开始吧。

  问题定义

  我发现SharePoint中的日历表是非常有用的。在本文中,我将创建一个显示我今天约会记录的Silverlight UI,而且保留在当前用户背景之下。

  为了达到此目的,我需要编写:

  一个Silverlight .xap 文件。我需要用Visual Studio 2008 SP1(带有Silverlight 安装工具)来进行工作,而且还要有Expression Blend 2 SP1来制作这个UI。

  一个WCF服务。该服务将在环境下工作,在当前登陆用户的安全环境下查看约会记录。Silverlight UI将使用basicHttpBinding来消耗服务。

  一个contract 。这个contract指定Silverlight应用程序如何与WCF对话。这个与WCF contract是相同的。

  第一步是要定义WCF contract,如下显示:

  

     [ServiceContract]  public interface IAppointments

  {

  [OperationContract]

  List GetAppointments();

  }

  在以上的代码中,BO.Appointment是一个自定义business object定义如下: 

  

      [DataContract]  public class Appointment

  {

  [DataMember]

  public DateTime AppointmentTime {

  get; set; }

  [DataMember]

  public string Title { get; set; }

  }

  Contract 定义后,你可以在其周围编写剩下的东西。 

  .NET 3.5开发模式的好处就是只要你解决了contract问题,你可以完全采用Sharepoint,除此之外还有:

  模拟机

  附加W3WP.exe的程序

  讨厌的GAC DLL版本,它的breakpoint似乎总是难以得到。

  我将简单的在我的Vista开发机上进行该项目,如Figure 1所示:

      SharePoint 2007与WCF和Silverlight

 

我创建了该项目如Figure 1所示,通过使用Visual Studio 2008 SP1的Silverlight工具,和我添加到项目上的WCF service l库。如你所见,MyServices class 库是一个WCF service 库,在执行先前定义的contract的Appointments.cs中主持一个服务。因为你尚未在SharePoint中运行,你可以消除不存在的约会,如下显示:

  

      public List< BO.Appointment> GetAppointments()  {

  List< BO.Appointment> toReturnAppts =

  new List< BO.Appointment>();

  toReturnAppts.Add(new BO.Appointment {

  Title = “First Appointment”,

  AppointmentTime = DateTime.Now });

  toReturnAppts.Add(new BO.Appointment {

  Title = “Second Appointment”,

  AppointmentTime = DateTime.Now });

  toReturnAppts.Add(new BO.Appointment {

  Title = “Third Appointment”,

  AppointmentTime = DateTime.Now });

  return toReturnAppts;

  }

  以上代码很简洁,因为他使用叫做”Object and Collection Initializers”的概念。它是在C#3.0中所采用的。 

  接下来,我要开始创建我的Silverlight应用程序的UI了。我需要一个可以绑定WCF service 调用结果的UI。

  

      < ListBox x:Name=”UserAppointments”  ItemTemplate=”{StaticResource ShowTime}”>

  < /ListBox>

  ”ShowTime”静态资源是一个作为资源定义的DataTemplate: 

  

     < DataTemplate x:Key=”ShowTime”>  < StackPanel Margin=”10″>

  < ContentControl

  Template= “{StaticResource clockTemplate}”

  Width=”120″ Height=”108″ DataContext=

  ”{Binding Path=AppointmentTime}”/>

  < TextBlock Text=”{Binding Path=Title}”

  HorizontalAlignment=”Center”/>

  < /StackPanel>

  < /DataTemplate>

  指向 StaticResource的ContentControl是另一个程序级资源——它只是一个采用DataTime的ControlTemplate并且显示一个好看的模拟时钟。你可以下载时钟ControlTemplate的代码(download the source code for the clock ControlTemplate)。 

  就这样,UI已经完成(而且真的很简单)。现在,你需要将一些数据放入其中,这样你可以看到它是如何运行的。

  Silverlight UI通过使用basicHttpBinding从WCF service中得到它的数据。为了做到这一点,你需要添加一个 WCF service reference(add a WCF service reference)到Silverlight程序中。

 

添加reference之后,你可以使用WCF 服务代理来获得约会的数据,并且把这些约会绑定到Silverlight UI中(参见Listing 1)。

      SharePoint 2007与WCF和Silverlight

  C#

  Listing 1. Code-Behind for the Silverlight Application:

  这个代码调用WCF service来获得指定用户的约会表。

  

 

      public partial class Page : UserControl  {

  public Page()

  {

  InitializeComponent();

  EndpointAddress endPointAddress =

  new EndpointAddress(

  ”http://localhost:52178/WCF/Service1.svc”);

  BasicHttpBinding basicHttpBinding =

  new BasicHttpBinding();

  AppointmentsClient client =

  new AppointmentsClient(

  basicHttpBinding, endPointAddress);

  client.GetAppointmentsAsync();

  client.GetAppointmentsCompleted +=

  new EventHandler< GetAppointmentsCompletedEventArgs>(

  client_GetAppointmentsCompleted);

  }

  void client_GetAppointmentsCompleted(

  object sender, GetAppointmentsCompletedEventArgs e)

  {

  UserAppointments.ItemsSource = e.Result;

  }

  }

 

在Listing 1中值得注意的重要事情是你必须异步的一直从Silverlight UIs中调用WCF 服务。如果不这样做会锁住浏览器——你的终端用户会不高兴的!

  当你编译并运行以上程序的时候,你将看到像Figure 2一样的UI。

  你可能已将注意到我还没有涉及到SharePoint。从技术上讲,整个的程序已经通过一个非SharePoint开发者进行开发了。但是,在这一点上,UI和WCF service骨架已经完成了,你可以使用SharePoint.

  进入SharePoint:编写WCF Service

  起初,你看到一些stub code代替WCF service——创建适合测试UI的模拟对象。要在SharePoint中进行此项工作,你只需要两个简单的步骤:

  你需要配置SharePoint来支持WCF,你可以通过使用在www.codeplex.com/SPWCFSupport.中找的的功能来实现。

  你还需要编辑WCF service代码在现有登录用户的安全背景下提取真实的约会记录。换句话说,你需要一个真实的提取记录(遵守当前登陆用户的安全环境)的WCF service代替你起初看到的假的WCF service。

  由于第一步如果你遵循链接,就是不言自明的,所以在本文中我将侧重于第二步。这个关键语就是”obeying the currently logged in user’s security context.”(遵守当前登陆用户的安全环境)。

  现在,你可以从SharePoint中完全运行WCF service,而且这样与你的Silverlight应用程序相比是在不同的上。但是在种情况下你必须设置一个跨域政策允许跨域调用进行工作。如果你在相同域的SharePoint中主持WCF service,你就不用担心了。

  默认情况下,WCF在ASP.NET之外工作,同样也在SharePoint之外工作。这是合理的,因为WCF的范围要比ASP.NET的大得多。但是WCF没有ASP.NET的兼容方式,可以让一个WCF service获得HttpContext.Current和SPContext.Current的reference。

  所以,让我们直接来到这里:在MacOS/Safari上运行的一个漂亮的Silverlight UI现在能够与在Sharepoint对象模式中完全参与的WCF service对话,使用现有的Sharepoint环境,并且现有的安全环境——也没有部署的问题!这比在糖果店一个没有家长陪同的5岁孩子走向警察时还要兴奋。

  有了现有的环境在手和一点SPQuery 魔法,我修改了WCF service执行代码如下显示:

  

 

      [AspNetCompatibilityRequirements(RequirementsMode =  AspNetCompatibilityRequirementsMode.Required)]

  public class Appointments : IAppointments

  {

  #region IAppointments Members

  public List< BO.Appointment> GetAppointments()

  {

  List< BO.Appointment> toReturnAppts =

  new List< BO.Appointment>();

  SPWeb web = SPContext.Current.Site.OpenWeb();

  SPList appointmentsList = web.Lists["Appointments"];

  SPListItemCollection items = appointmentsList.GetItems(

  new SPQuery(

  appointmentsList.Views["Current Events"]));

  IEnumerable< BO.Appointment> todaysAppts =

  from item in items.OfType< SPListItem>()

  select new BO.Appointment

  {

  Title = item[3].ToString(),

  AppointmentTime = Convert.ToDateTime(item["Start Time"])

  };

  toReturnAppts.AddRange(todaysAppts);

  return toReturnAppts;

  }

  #endregion

  }

然后我更新了相关的Sharepoint地址的端点地址并重新构建.xap文件,它是我将放在Sharepoint .wsp解决方案包中的文件,所以我可以连同其他文件一起部署。

  在Sharepoint中部署一切事情

  让我把这个小节变得更简单些。你可以部署任何事情作为一个解决方案,但是创建解决方案的最简单方法就是WSPBuilder。这里是高级别部分的部署:

  WCF service作为解决方案(在这里描述的here)的一部分进行部署。注意的是在这种情况下WCF Service 需要ASP.NET兼容模式下运行。

  同样的解决方案通过使用在相关的elements.xml 中的< Module>标签,在文件库中部署.xap文件。你还可以部署.xap作为你希望的一个实际文件。

  最后,相同的解决方法hiatus可以部署一个应用程序页面,并且为它创建一个自定义功能菜单。

  总之,来自WSPBuilder的class 库创建一个解决方案如Figure 3所示:

  SharePoint 2007与WCF和Silverlight

  该图表显示在部署的Silverlight+WCF解决方案中的文件….

  当你启用这些功能时,并且浏览程序网页的时候,你将会看到运行在浏览器中的Silverlight应用程序,带有完全访问Sharepoint环境的权利,在现有的登录用户的安全环境下,在一个漂亮的UI中(参看Figure 4)。

  SharePoint 2007与WCF和Silverlight

  虽然这个例子显示了运行在一个Sharepoint应用程序页面中的Silverlight应用程序,它可以很容易的在一个Web Part中运行,或是其他的。

  本文演示了.NET 3.5 开发模式如何简化Sharepoint 开发,让平台比以往的等具有吸引力。这个项目的大部分是在Sharepoint以外开发的,并且逐步部署到Sharepoint,现在已经完成了。这个有以下一些显著的优势:

  一个很好的开发经验。我在虚拟机以外做过很多困难的开发,在Vista OS上运行Sharepoint。

  充分利用人才。你有能力合理规划并利用你团队的不同的技术,而不是找一个精通所有Silverlight,Sharepoint和WCF,等等的超级英雄——要有一个合理的价格。

  模块化代码。开发的代码是模块化得。基于SOA构架确保这个程序不会影响其他的。

  支持良好的开发做法。这个模式让你遵循稳固的开发做法,例如有效的源控制和有效的单元测试。

  可维护的结果。最后,也是最重要的,制作一个模块化的解决方案意味着你的产品需要较少的努力去编写,更多的努力去维护。当你最后一次将这两个优势连在一起时在什么时候?

No tags

No comments yet.

Leave a Reply

<<

>>

Theme Design by devolux.nh2.me