使用 SharePoint 2010 中的业务连接服务

Kirk Evans

我的孩子 ’ 最喜爱的图书的一个称为 如果您授予一个鼠标一个 Cookie 通过刘娜 Numeroff─a 子级已经簿基于 slippery 斜率概念如果您赋予一个鼠标 cookie,他将要求提供牛奶,意识到他 thirsty。当他 drinks 该牛奶时,他将要求提供一个镜像某些剪刀再一个 broom 某些蜡笔和在和上,一旦他认识到项的实用程序的新项询问他当前具有。

这是我看到的发展沿与 SharePoint 采纳时间线的许多用户:它们缓慢,开始上载几个文档,然后使用工作流和窗体,并最终会希望将其网站上的图面外部数据进度。它 isn’t 直到您看到如何比较容易任务已完成您决定转的下一个挑战。

它 ’s 的一种常见情况:我有一个门户,我有一些外部的数据和所需的数据集成我门户以有意义的方式。Microsoft Office SharePoint Server 2007 (MOSS 2007) 引入业务数据目录 (BDC),以便于该确切的方案:便于内部门户体验的表面外部数据。渚嬪可以创建定义之间 SharePoint 和外部数据映射,因此它可以在一个 Web 部件中呈现、 用作列列表中和甚至集成到搜索 XML 定义文件。

当我向公司如何才能使用 BDC 将映射到现有的业务线应用程序时,灯泡通常开启后显示搜索结果,其中包括人员、 文档、 列表数据和从其现有的 LOB system─all 相同的结果集内的数据。

即使该 BDC MOSS 2007 中的启用了连接到外部系统,时很难创建解决方案,因为缺少的设计器。此外,尽管 BDC 做相对容易创建显示在 Business Data List Web Part 中的数据的只读解决方案,不那么简单创建启用用户进行更改,并编写到外部存储备份数据的解决方案。

在 SharePoint 2010 的业务连接服务 (BCS) 是所有有关连接到外部数据。BCS 增强了 SharePoint 平台已经具有全新的功能、 服务和简化的解决方案与外部数据和服务的深度集成的开发工具的功能。BCS 基于其 BDC 前身构建,继承了演示、连接、工具和生命周期管理等关键领域的功能。渚嬪 SharePoint 2010 中它 ’s 易于使用 SharePoint 设计器创建外部的内容类型、 创建 SharePoint 已经 Web 用户界面中的外部列表和列表脱机考虑到 Outlook,作为一组联系人。此外,您可以在外部系统中更新也将导致数据的 Outlook 中的联系人进行更新。

BCS 体系结构

图 1 演示关键组件构成 BCS。

图 1 的 业务连接服务体系结构

  • BDC 元数据存储 – 在 BDC 元数据存储为每种描述如何连接到外部存储外部的内容类型的集合提供存储。元数据存储作为服务层的一部分。外部内容的类型是 BCS 的基本构建基块。
  • BDC 服务器运行时 – 在 BDC 服务器运行时必须了解如何到达到后端存储区和连接到基于外部的内容类型定义内容类型存储内的数据。它 ’s 需要注意的首字母缩写词来引用提供是 BCS 的组件的连接的服务集的 BDC 新用法。
  • 安全 – BCS 提供与该安全存储服务 (SSS),以及启用安全模型的集成。
  • 解决方案打包 – BCS 用生成的解决方案可以为 Office VSTO 包被传递到 SharePoint 工作区、 Outlook 和 Word 包括一个胖客户端可视化的 Studio 工具作为被打包。BCS 还公开扩展解决方案打包为面向其他客户端的 api。
  • 外出时的用户界面 – BCS 向前携带能够显示通过 Web 部件用户界面的外部数据,并提供了更深层的集成通过外部列表添加。
  • BDC 客户端运行时 – 对称的运行库提供了用于客户端和服务器,使您能够采取解决方案脱机与客户端缓存,还可以连接并推送更改回服务器以一致的方式。BDC 客户端运行时的使用允许外部数据缓存进行交互的脱机操作。
  • 设计工具 – SharePoint 设计器提供了丰富的全新的功能,用于创建包括可以定义外部的内容类型和外部列表,并定义转移数据创建简单的解决方案的 InfoPath 表单的 BCS 解决方案。visual Studio 提供了为专业开发人员扩展这些功能的同时利用现有框架中创建的高级的解决方案能力。

这些投资 BCS 体系结构中的启用其他功能包括商业智能、 企业内容管理、 协作和社交功能以及企业搜索的 SharePoint 平台中与交互。此外,BCS 的使用提供引人注目的开发人员平台使快速地利用这些功能的解决方案的创建。

第一次我看到 BCS,时跳立即转出在我的两件事情。首先,从开发人员已经角度它 ’s 现在令人难以置信易于获取外部数据脱机通过轻松地分发由于到 VSTO 加载项利用 ClickOnce 功能,Microsoft.net 框架中的项的生成的智能客户端解决方案。真的是在第二件事是包含的客户端缓存中利用了 SQL 精简版作为其持久存储,并能够在同步和从客户端解决方案与外部系统的更改。这应该向开发人员提供强的有意义的可靠性,因为它利用了一些行之有效的并广泛采用的技术。

一旦您识别 BCS 实质上是提供对外部数据、 一个对称的客户端和服务器运行时数据和 BCS 解决方案的包装进行交互与智能客户端应用程序一起使用的连接,您可以立即查看的解决方案,您可以在与现有系统集成,并可以快速给最终用户提供丰富的功能。

它还应熟悉 BCS 包括更多方案比简单地连接到数据,使其成为一个非常引人注目的选择,以启用解决方案的开发人员其前置任务的任何人都很明显。本文的其余部分将讨论的外部内容类型创建和 BCS 的脱机功能的更详细信息。

了解外部的内容类型

外部的内容类型的概念是 BCS 的基础。Windows SharePoint Services 3 引入来描述一个可重用的架构的列表内容类型的概念。外部的内容类型通过描述架构以及外部系统和其行为 Office 和 SharePoint 内的数据访问功能扩展此概念。您可能认为外部的内容类型的 SharePoint 与外部系统之间映射为描述实体和数据源的行为。

部署 BDC 元数据存储到一个 XML 语法中使用元数据定义外部的内容类型。对于那些熟悉 MOSS 2007 中 BDC,此概念以前称为一个 BDC 实体,但概念已扩展到包括 SharePoint 和 Office 内外部数据的行为方式。

SharePoint 设计器 2010年提供一个简单的界面,快速创建外部的内容类型,并创建基于这些外部的内容类型的外部列表。为什么,然后,要使用 Visual Studio 创建外部的内容类型?  有时,您需要执行某些操作 SharePoint 设计器 2010 doesn’t 提供框中。创建自定义的外部内容类型是在其中您使同一外部系统的多次调用、 使多个外部系统的多次调用或甚至读取一个外部系统和写入到另一个的聚合方案中很有用。创建自定义的外部内容类型还可用于复杂转换外部系统中数据的格式之间没有清晰的映射的位置以及如何应呈现在 SharePoint 内。您可能会实现自定义安全代码,或甚至实现复杂的后端系统进行交互所需的自定义业务逻辑。

IT 专业人员可以使用 SharePoint 设计器 2010年创建一个外部的内容类型的消耗和将数据写入到 SQL Server、 Windows 通讯基础 (WCF) 服务或.net 类型。这样,通过允许他们使用从开发人员已公开的源数据的 IT 专业快速简单的解决方案的创建。作为一个示例 IT 专业人员会打开 SharePoint 设计器 2010年、 单击在左侧导航窗格中的外部的内容类型、 单击在功能区,新建外部的内容类型按钮并单击 “ 单击此处可发现外部数据源并定义操作 ” 链接。在生成操作设计器对话框中,您可以添加到数据库表的连接,然后用鼠标右键单击要创建并阅读下,选择单个记录,更新甚至删除 (提供具有足够的凭据来执行此,当然) 一个数据库表中的行的方法的 “ 创建全部操作 ” 表。要查看此外观,请参阅 的 图 2

图 2 创建操作使用 SharePoint 设计器 2010年

外部的内容类型实际上是可重用的外部数据允许它作为本机 Office 实体参与跨多个应用程序,如说明:

  • 为外部列表的 SharePoint
  • Outlook
  • SharePoint 工作区
  • Word
  • InfoPath
  • 访问
  • 通过代码其他 Office 应用程序

这是启用连接 SharePoint 外部系统的知识工作者一个 hugely 强大功能和图面以可读和可写的方式,通过客户端应用程序的多个类型的数据。这还提供了一个非常有趣的商机的开发人员能够使知识工作者与执行复杂操作使用 SharePoint 设计器 2010 本身如聚合来自多个源的数据,提供复杂的转换、 评估复杂的业务逻辑或自定义的安全要求或多次调用系统时不可能的解决方案来提供数据的单个视图。

根据处理 BCS 框架读取各种文档或 BCS 中的文章可能注意到不明确的术语 外部内容键入实体 使用。它们是一个及相同。术语 实体 SharePoint 2007 环境中存在,并在运行时 API 级别仍然存在。此术语通常用于满足主要是为了开发人员的 外部内容键入 如 SharePoint 设计器 2010年满足指向多个访问群体的环境中使用与相对的环境中。当工具或文档看起来相同的操作 外部内容键入实体 ─they 平均值之间切换,don’t 会感到困惑。

使用 Visual Studio 2010 创建实体

let’s 查看聚合方案中,以便更好地了解外部的内容类型,从开发人员已经视角的角色。我们将作为 RESTful 服务公开有关客户,数据的示例使用 Twitter API 和我们使用自定义数据库模仿客户关系管理 (CRM) 系统,以包括有关我们的客户,如最后一次采购日期的附加信息和最后一次采购量。我们将聚合数据从这些两个外部源组合在一起,并将表示数据的 SharePoint 列表中透明地向最终用户。

在 Visual Studio 2010 新建项目对话框中选择 “ 业务数据连接模型 ” 并使用项目名称 “ Msdn.Samples.BCS ”。新的项目向导将要求您选择一个要用于调试的 SharePoint 站点。最后,Visual Studio 2010 存根出实体、 实体服务、 模型定义和使用以支持 Visual Studio 设计图面上一个关系图文件的代码。

Entity1.cs 文件描述该实体的架构,并作为公共属性与典型类进行建模。Entity1Service.cs 文件提供的这两种方法会为您创建作为示例的 CRUD (创建、 读取、 更新、 删除) 方法实现。创建第一个方法是使您可以从外部标识符所基于的存储区中检索特定记录的 ReadItem。这被映射到 XML 元数据作为方法实例的类型 “ SpecificFinder ”。创建的第二种方法是从外部存储中检索所有记录的 ReadList。这是作为 “ Finder ” 方法实例映射 XML 元数据中。这些是最小您实体需要实现来充当一个连接器用于 BCS 的这两种方法。

建模实体

let’s 首先对该实体本身的更改。用 的 图 3 所示的代码替换实体类。

图 3 的 替换代码的实体类

namespace Msdn.Samples.BCS.SocialModel
{    
public partial class Customer
    {        
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }        


//Twitter specific properties
public string TwitterScreenName { get; set; }             
public string TwitterStatus { get; set; }

//CRM specific properties
public DateTime DateLastPurchase { get; set; }
public decimal AmountLastPurchase { get; set; }
    }
}

切换回实体设计图面上,通过替换代码,在解决方案资源管理器窗格和通知中打开.bdcm 文件 doesn’t 影响设计图面上的实体。在设计图面上的实体表示元数据。它向我们提供了一些我们的代码和元数据中 SharePoint 期望之间映射 ’s。实体名称更改为 “ 客户 ” 中建模设计图面。接下来,Identifier1 实体标识符上单击、 将其重命名为客户 id 和 System.Int32 来更改其类型。现在,我们 SharePoint 指示我们客户实体具有名为客户 id 是一个整数标识符和此实体映射到我们的客户类。

建模该方法

现在,我们建模我们实体,我们需要建立模型及其方法。如前面提到 Visual Studio 将创建为我们提供最小功能称为 ReadItem 和 ReadList 的两种方法。我发现它容易第一个删除这两种从 BDC 方法的详细信息窗格中的那些方法,然后与所需的名称在其位置创建新的方法。这样,您就可以看到如何执行该映射到处理干净 slate。若要执行此操作打开 BDC 方法的详细信息窗格并单击 ReadList 方法上单击删除按钮。ReadItem 的执行相同操作。警告的注意:我已经找到了不希望在实体设计本身,而被小心进行编辑 (通过 BDC 方法的详细信息窗格或 BDC 资源管理器窗格尽可能中执行这些操作。

我们首先建模 SharePoint 使用我们的列表中的所有项的列表中检索该 SpecificFinder 方法。现在,您可以使用干净 slate,单击 “ < 添加一个方法 > ” 文本 BDC 方法的详细信息窗格中。单击该文本将显示一个下拉箭头并再次单击将提供的方法类型若要创建的列表。选择 “ 创建特定查找程序方法 ” 选项,它会创建一个称为 ReadItem、 其参数和方法实例的方法。在相同的窗格中注意到有三列:名称、 方向和类型说明符和返回参数具有一个称为客户的类型说明符。单击客户类型说明符和属性窗格以查看类型 Name 属性是当前 System.String 中查找。我们需要告知 SharePoint,它将返回我们新的客户类型,因此此值更改为 “ Msdn.Samples.BCS.Customer,Msdn.Samples.BCS ”。

这是很好的时间来指出 BDC 资源管理器窗格。此窗格提供了我们的模型、 其实体和它们的方法的分层视图。展开 ReadItem 方法,您将看到与子节点表示类型说明符 “ 客户 ” “ 客户 ” 参数。我们需要作为子来代表我们的复杂类型中添加其他类型描述符。这是一个简单的操作,只需右击 “ 客户 ” 类型说明符在 BDC 资源管理器并选择 “ 添加类型描述符 ”。名称更改为客户 id 和到 System.Int32 其类型。重复此过程添加具有适当的名称和类型以反映客户类前面创建的类型说明符。一旦您创建的类型说明符所有,请单击客户 id 类型说明符和客户 id 以其标识符属性和它的只读属性设置为 True。最终的产品应类似于 的 图 4

图 4 使用 BDC 资源管理器窗格中设置该 TypeDescriptors 的属性

下一步是创建该方法将返回客户的完整列表。因为我们已经定义客户类型和其类型描述符工时下, 一步是很容易。请回到 BDC 方法的详细信息窗格中,并单击到 “ < 添加方法 > ” 文本和选择 “ 创建查找程序方法 ” 选项。在创建一个称为 “ ReadList ” 的新方法和它的类型是泛型的 Customer 对象列表。此外,为我们,已定义类型说明符所以现在我们可以将精力集中在实现这些方法。

实现该方法

我们的方案要求我们要聚合的数据来自联机源 — Twitter — 和单独的存储区 — SQL Server 数据库。我实现帮助器类称为 TwitterHelper 帮助从 Twitter 中获取数据和 stuffing 到我们的客户实体类型。GetChannelWithCredentials 方法可以帮助我们使用 WCF 和其 Web 编程的功能,以方便地调用 Twitter 使用特定的一组凭据。GetCustomersFromTwitter 方法返回用户及其当前状态的列表,并将数据存储中的客户对象的列表。GetCustomerFromTwitterByScreenName 方法从 Twitter 基于用户已经屏幕名称检索单个用户,并返回单个客户对象中的数据。的 图 5 显示了在 TwitterHelper 的代码。

图 5 的 TwitterHelper 类

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Channels;
using System.Xml.Linq;

namespace Msdn.Samples.BCS.SocialModel
{
    [ServiceContract]
public interface ITwitterFriends
    {
        [OperationContract]
        [WebGet(UriTemplate="/statuses/friends.xml")]
        Message GetAllFriends();

        [OperationContract]
        [WebGet(UriTemplate = "/users/show.xml?screen_name={screenName}")]
        Message GetFriendByID(string screenName);

    }

public class TwitterHelper
    {
public static List<Customer> GetCustomersFromTwitter()
        {
var cf = GetChannelWithCredentials();

using(cf)
            {
                ITwitterFriends proxy = cf.CreateChannel();
                Message m = proxy.GetAllFriends();

List<Customer> customers =
                        (from user in XDocument.Load(m.GetReaderAtBodyContents()).Root.Elements("user")
select new Customer
                         {
                             TwitterScreenName = user.Element("screen_name").Value, 
                             TwitterStatus = user.Element("status").Element("text").Value
                         }).ToList();

return customers;
            }
        }

public static Customer GetCustomerFromTwitterByScreenName(string screenName)
        {
var cf = GetChannelWithCredentials();

using (cf)
            {

                ITwitterFriends proxy = cf.CreateChannel();
                Message m = proxy.GetFriendByID(screenName);

                XElement user = XDocument.Load(m.GetReaderAtBodyContents()).Root;

                Customer c = new Customer
                {
                    TwitterScreenName = user.Element("screen_name").Value,                    
                    TwitterStatus = user.Element("status").Element("text").Value
                };

return c;
            }
        }

private static WebChannelFactory<ITwitterFriends> GetChannelWithCredentials()
        {
            WebHttpBinding binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
            binding.MaxReceivedMessageSize = 999999;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
            binding.Security.Transport.Realm = "Twitter API";

            Uri location = new Uri("http://www.twitter.com");
            WebChannelFactory<ITwitterFriends> cf = new WebChannelFactory<ITwitterFriends>(binding, location);
            cf.Credentials.UserName.UserName = "your_twitter_screenname_here";
            cf.Credentials.UserName.Password = "your_password_here";

return cf;
        }

    }
}

我们的数据库表是十分简单 ; 此处是其架构:

CREATE TABLE [dbo] [客户]
[客户 id] [] int IDENTITY(1,1) 不为空
[名字] [] nvarchar(50) 不为空
[姓氏] [] nvarchar(50) 不为空
[TwitterScreenName] [] nvarchar(100) 不为空
[DateLastPurchase] [日期] 不为空
[AmountLastPurchase] [十进制](18,0) 不为空)

若要轻松地查询数据,我到我的项目添加到 SQL 类的一个 LINQ 和指向在客户数据库表中生成 dbml 文件。我第一个方法 GetCustomer,使用 SQL 的 LINQ 查询数据库以进行单个客户记录,然后从 Twitter 中获得该用户的当前状态。的 图 6 中详细描述了 GetCustomer 和 GetCustomerList 方法。最后一步是按 f5 键以部署我们外部的内容类型,并启动调试,从而使您可以将断点设置在代码中以确保一切工作正常。

图 6 的 GetCustomer 和 GetCustomerList 方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;



namespace Msdn.Samples.BCS.SocialModel
{
public partial class CustomerService
    {
private const string CONNECTION_STRING = @"Data Source=moss2010demo\sqlserver;Initial Catalog=CustomerCRM;Integrated Security=True";

public static Customer GetCustomer(int customerID)
        {            
//Pull from database, then pull from Twitter
using (CustomerCRMDataContext db = new CustomerCRMDataContext(CONNECTION_STRING))
            {
                Customer customer = (from c in db.Customers
where c.CustomerID == customerID
select new Customer
                     {
                         CustomerID = c.CustomerID,
                         FirstName = c.FirstName,
                         LastName = c.LastName,
                         AmountLastPurchase = c.AmountLastPurchase,
                         DateLastPurchase = c.DateLastPurchase,
                         TwitterScreenName = c.TwitterScreenName
                     }).FirstOrDefault();

                Customer friend = TwitterHelper.GetCustomerFromTwitterByScreenName(customer.TwitterScreenName);
                customer.TwitterStatus = friend.TwitterStatus;                
return customer;
            };

        }

public static IEnumerable<Customer> GetCustomerList()
        {
//Pull all friends from Twitter, 
// then only return friends that also have CRM records
List<Customer> friends = TwitterHelper.GetCustomersFromTwitter();

List<Customer> customers = new List<Customer>();

using (CustomerCRMDataContext db = new CustomerCRMDataContext(CONNECTION_STRING))
            {
foreach (Customer friend in friends)
                {
var cust = db.Customers.FirstOrDefault(c => c.TwitterScreenName == friend.TwitterScreenName);
if (null != cust)
                    {
                        customers.Add(new Customer
                        {
                            CustomerID = cust.CustomerID,
                            FirstName = cust.FirstName,
                            LastName = cust.LastName,
                            AmountLastPurchase = cust.AmountLastPurchase,
                            DateLastPurchase = cust.DateLastPurchase,
                            TwitterScreenName = cust.TwitterScreenName,
                            TwitterStatus = friend.TwitterStatus
                        });
                    }
                }
return customers;
            };                        
        }

    }
}

我已经提到的有趣点是能够在脱机的客户端中进行更改并同步它们返回到外部数据存储区。这可通过执行更新方法。若要执行此操作只需向 BDC 方法的详细信息窗格添加新的更新方法。更新程序方法的一个示例正文可能类似于 的 图 7 所示的代码:

图 7 的 同步更改的更新方法

public static void Update(Customer customer)
{
//Update only the CRM database information
using (CustomerCRMDataContext db = new CustomerCRMDataContext(CONNECTION_STRING))
    {
var cust = db.Customers.Single(c => c.CustomerID == customer.CustomerID);
    cust.AmountLastPurchase = customer.AmountLastPurchase;
    cust.DateLastPurchase = customer.DateLastPurchase;
    db.SubmitChanges();
    };
}

您可以看到在 Visual Studio 2010 加工使得很轻松地创建可写的外部内容类型。

创建列表和脱机编制它

目前为止我们只创建了外部的内容类型。我们尚未创建一个列表,以代表外部的内容类型的实例。因为我们命中 F5 部署我们外部的内容类型在上一步中,您应现在将调试器附加到 SharePoint 网站上查找。在网站操作网站操作中左上角的菜单在屏幕的单击 “ 查看所有网站内容 ” 的选项。一旦将显示 viewlsts.aspx 页,单击将调出一个新的对话框,允许您创建几种不同类型的内容 “ 创建 ” 链接。选择从已安装的项目集的外部列表,然后单击创建按钮。所得到的网页中提供新的列表的名称并从列表中选择一个现有的外部内容类型 (请参阅 的 图 8)。

图 8 创建使用外部的内容类型列表

按创建按钮后,您应最后会奇怪带有中作为 SharePoint 中的数据的列表显示您 labors 的水果 SharePoint 列表 (请参阅 的 图 9)。

图 9 的 生成使用外部的内容类型的列表

脱机采取列表

在 SharePoint 2010 外部连接巨大的改进之一是能够使列表脱机和同步数据。下一步是打开 SharePoint 设计器 2010年,因此我们可以看到开发人员和 IT 专业人员角色如何协同工作是创建了外部的内容类型的解决方案。

我们已经看到了文章的开头为知识工作者可以使用 SharePoint 设计器 2010年创建或消耗外部内容的类型。使用 SharePoint 设计器 2010年打开 SharePoint 网站,并单击外部的内容类型的链接在导航窗格中。您将看到列出的一种可供选择的外部内容的类型为我们 Msdn.Samples.BCS.SocialModel.Customer 类型。单击的链接,并会转到摘要视图为我们外部的内容类型,我们可以看到该方法我们在元数据中定义,并在代码中实现。

在此页的外部内容的类型信息部分中,您将看到下拉列表用于指定 Office 项类型。单击此下拉列表框以显示下列选项:

  • 泛型列表
  • 约会
  • Contact
  • Task
  • 公告

此列表,可以在外部的内容类型中数据表示为其中一种反过来会影响如何显示和同步数据的类型。渚嬪选择联系人类型可让您考虑到 Outlook,表示为联系人列表的列表脱机。同样,如果您的数据类似于日历项目您可以为在 Outlook 中将约会模型它。这提供了强 Outlook 作为脱机的客户端的同时提供能够更新数据并同步回发到外部数据源的 SharePoint 数据之间的集成。若要将您的数据映射为 outlook 联系人,更改联系人移到 Office 项类型拖放。这将生成一个新的警告,告诉我们该映射不正确。双击 GetCustomer 方法显示映射对话框。直到您转至返回参数配置屏幕,请单击下一步。最小要求的映射联系人类型是映射最后一个名称参数。要执行此操作单击数据源元素树视图中的姓氏属性并在右侧将 Office 属性更改为姓氏属性。虽然我们您的位置将映射到 FirstName Office 属性的名字属性。所得结果在图 10 中显示。

图 10 的 映射数据源元素到 Office 属性

一旦我们提供映射到 Office 类型,我们可以转回到 SharePoint 对于在 Web 用户界面中单击在功能区用户界面,列表部分,然后选择 “ 连接到 Outlook ”。这将使一个申请到 SharePoint 创建 VSTO 包安装到本地桌面在一个 Outlook 添加此列表-中 (请参阅 的 图 11)。

图 11 ClickOnce 用于提供外部的内容类型的脱机体验

一旦安装了 VSTO 包,向上联系人就像在 Outlook 中, 任何其他联系人项目和第一个和最后一个名称属性映射相应地为您的项目最终用户打开可以看到在 的 图 12

图 12 从我们的外部实体的数据后,才能在 Outlook 与在底部窗格中自定义字段数据保留中的使用

此外,额外的数据保留和显示在联系人窗体上为还提供一个方便的位置,以便进行更新并将它们保存到本地缓存,以便与外部系统稍后进行同步。这样,您将获得使用包括在 Windows 中使用添加/删除程序对话框中卸载能力的 ClickOnce 技术的相同的好处,通过 ClickOnce,传递 VSTO 该包。

无休止的可能性

在 SharePoint 2010 BCS 功能是这么多我可以轻松地编写一个整册主题上。我发现难以选取本文中突出显示的只是几个主题。是否引入了大量的主题并 didn’t 甚至开始以覆盖在其他许多可能方面,如提供自己的窗体使用 SharePoint 工作区,访问 BCS 数据通过 BDC 客户端运行库中显示的 InfoPath 如何您可能开发您自己 VSTO 外接程序以使 Excel 2010 使用 BCS,与基于索赔的安全或安全存储服务与集成到 BCS 功能。

有以便我确定 BCS 将用作许多文章和书籍有待几年中下一个主题的很多的可能性。就像当您授予一个鼠标 cookie,一次开始使用 BCS,想要执行的操作越来越多与此 fascinating 技术。

Kirk Evans* 是一个行业架构师,对于 Microsoft 已经通信扇区的做法。他一起创建特定于行业的解决方案最大媒体公司、 telcos、 出版商和广告代理机构。请在 blogs.msdn.com/kaevans 方士已经博客的访问。*

感谢到下面的技术专家为审阅此文章:Lionel Robinson 和 Brad Stevenson