Sdílet prostřednictvím


Podrobné pokyny: Rozšiřování typu položky projektu SharePoint

Můžete použít položku projektu Model Připojení obchodních dat k vytvoření modelu pro službu Připojení obchodních dat ve službě SharePoint. Ve výchozím nastavení se data v modelu uživatelům nezobrazí, když vytvoříte model pomocí této položky projektu. Musíte také vytvořit externí seznam ve službě SharePoint pro umožnění zobrazení dat uživatelům.

V tomto návodu vytvoříte rozšíření pro položku projektu Model Připojení obchodních dat. Vývojáři mohou pomocí rozšíření vytvořit externí seznam v jejich projektu, který zobrazuje data v modelu služby BDC. Tento návod demonstruje následující úkoly:

  • Vytvoření rozšíření aplikace Visual Studio, které provádí dvě hlavní úlohy:

    • Generuje externí seznam, který zobrazí data v modelu služby BDC. Rozšíření používá model objektu pro projekt systému SharePoint ke generování souboru Elements.xml, který definuje seznam. Také přidá soubor do projektu tak, aby byl nasazen spolu s modelem služby BDC.

    • Přidá položku nabídky zástupců položek projektu Model Připojení obchodních dat v Průzkumníku řešení. Vývojáři mohou kliknutím na tuto položku nabídky generovat externí seznam pro model služby BDC.

  • Vytváření rozšíření aplikace Visual Studio balíčku (VSIX) pro nasazení sestavení rozšíření.

  • Testování rozšíření.

Požadavky

Ve vývojovém počítači potřebujete následující součásti pro dokončení tohoto návodu:

Znalost následujících konceptů je užitečná, ale není požadována k dokončení návodu:

Vytváření projektů

Chcete-li dokončit tento návod, je nutné vytvořit dva projekty:

  • Projekt VSIX k vytvoření balíčku VSIX pro nasazení rozšíření položky projektu.

  • Projekt knihovny tříd, který implementuje rozšíření položky projektu.

Začněte postup vytvořením projektů.

Pro vytvoření projektu VSIX

  1. Spusťte nástroj Visual Studio.

  2. V nabídce File (Soubor) přejděte na příkaz New (Nový) a klepněte na příkaz Project (Projekt).

  3. V dialogovém okně Nový projekt rozbalte uzly Visual C# nebo Visual Basic a potom klikněte na uzel Rozšiřitelnost.

    Poznámka

    Uzel Rozšiřitelnost je k dispozici pouze v případě, že nainstalujete Visual Studio 2010 SDK. Další informace naleznete ve výše uvedeném oddílu požadavků.

  4. V poli se seznamem v horní části dialogového okna zvolte Rozhraní .NET framework 4. Rozšíření nástrojů SharePoint vyžaduje funkce této verze rozhraní .NET Framework.

  5. Klikněte na šablonu Projekt VSIX.

  6. Do pole Název zadejte GenerateExternalDataLists.

  7. Klepněte na tlačítko OK.

    Visual Studio přidá projekt GenerateExternalDataLists do Průzkumníku řešení.

Chcete-li vytvořit projekt rozšíření

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel řešení, klikněte na Přidat a pak na Nový projekt.

    Poznámka

    V projektech v jazyce Visual Basic se uzel řešení zobrazí v Průzkumníku řešení pouze pokud je označeno zaškrtávací políčko Vždy zobrazit řešení Obecné, projekty a řešení, dialogové okno Možnosti.

  2. V dialogovém okně Nový projekt rozbalte uzel Visual C# nebo Visual Basic a potom klikněte na Windows.

  3. V poli se seznamem v horní části dialogového okna zvolte Rozhraní .NET framework 4.

  4. Zvolte šablonu projektu Knihovna tříd.

  5. V poli Název zadejte BdcProjectItemExtension.

  6. Klepněte na tlačítko OK.

    Visual Studio přidá projekt BdcProjectItemExtension do řešení a otevře soubor výchozího kódu Class1.

  7. Odstraňte soubor kódu Class1 z projektu.

Konfigurace projektu rozšíření

Před napsáním kódu pro vytvoření rozšíření položky projektu přidejte soubory kódu a odkazy na projekt sestavení.

Chcete-li konfigurovat projekt

  1. V projektu BdcProjectItemExtension přidejte dva soubory kódu, které mají následující názvy:

    • ProjectItemExtension

    • GenerateExternalDataLists

  2. V nabídce Projekt klepněte na příkaz Přidat odkaz.

  3. Na záložce .NET stiskněte klávesu CTRL klikněte na tlačítko následujících sestavení a potom klikněte na tlačítko OK:

    • Microsoft.VisualStudio.SharePoint

    • System.ComponentModel.Composition

    • WindowsBase

Definování rozšíření položky projektu

Vytvořte třídu, která definuje rozšíření položky projektu Model Připojení obchodních dat. Chcete-li definovat rozšíření, třída implementuje rozhraní ISharePointProjectItemTypeExtension. Toto rozhraní implementujte, kdykoli budete chtít rozšířit existující typ položky projektu.

Chcete-li definovat rozšíření položky projektu

  1. Poklikejte na soubor s kódem ProjectItemExtension.

  2. Do souboru vložte následující kód.

    Poznámka

    Po přidání tohoto kódu bude mít projekt několik chyb kompilace. Těmto chybám předejdete přidáním kódu v dalších krocích.

    Imports Microsoft.VisualStudio.SharePoint
    Imports System.ComponentModel.Composition
    
    Namespace Contoso.SharePointProjectItemExtensions.GenerateExternalDataLists
    
        ' Export attribute: Enables Visual Studio to discover and load this extension.
        ' SharePointProjectItemType attribute: Specifies the ID of the project item to extend.
        ' GenerateExternalDataListsExtension class: Defines the extension for the BDC project item.
        '     The other part of the partial class contains the logic for generating the external data lists. 
        <Export(GetType(ISharePointProjectItemTypeExtension))> _
        <SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.BusinessDataConnectivity")> _
        Partial Friend Class GenerateExternalDataListsExtension
            Implements ISharePointProjectItemTypeExtension
    
            ' Creates the new shortcut menu item that the user clicks to generate the external data lists.
            Private Sub Initialize(ByVal SharePointProjectItemType As ISharePointProjectItemType) _
                Implements ISharePointProjectItemTypeExtension.Initialize
                AddHandler SharePointProjectItemType.ProjectItemMenuItemsRequested,
                    AddressOf SharePointProjectItemMenuItemsRequested
            End Sub
    
            Private Sub SharePointProjectItemMenuItemsRequested(ByVal Sender As Object, _
                ByVal e As SharePointProjectItemMenuItemsRequestedEventArgs)
                Dim generateListMenuItem As IMenuItem = e.ViewMenuItems.Add("Generate External Data List")
                AddHandler generateListMenuItem.Click, AddressOf GenerateExternalDataLists_Execute
            End Sub
        End Class
    End Namespace
    
    using Microsoft.VisualStudio.SharePoint;
    using System.ComponentModel.Composition;
    
    namespace Contoso.SharePointProjectItemExtensions.GenerateExternalDataLists
    {
        // Enables Visual Studio to discover and load this extension.
        [Export(typeof(ISharePointProjectItemTypeExtension))]
    
        // Specifies the ID of the project item to extend.
        [SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.BusinessDataConnectivity")]
    
        // Defines the extension for the BDC project item. The other part of the partial class contains
        // the logic for generating the external data lists. 
        internal partial class GenerateExternalDataListsExtension : ISharePointProjectItemTypeExtension
        {
            // Implements IProjectItemTypeExtension.Initialize. Creates the new shortcut menu item that
            // the user clicks to generate the external data lists.
            public void Initialize(ISharePointProjectItemType projectItemType)
            {
                projectItemType.ProjectItemMenuItemsRequested += ProjectItemMenuItemsRequested;
            }
    
            private void ProjectItemMenuItemsRequested(object sender, SharePointProjectItemMenuItemsRequestedEventArgs e)
            {
                e.ViewMenuItems.Add("Generate External Data List").Click += GenerateExternalDataLists_Execute;
            }
        }
    }
    

Vytváření seznamů externích dat

Přidejte částečnou definici třídy GenerateExternalDataListsExtension, která vytváří seznam externích dat pro každý subjekt v modelu služby BDC. Chcete-li vytvořit seznam externích dat, tento kód nejprve čte data subjektu v modelu služby BDC pomocí analýzy dat XML v souboru modelu služby BDC. Potom vytvoří instanci seznamu, která je založena na modelu služby BDC a přidá tuto instanci seznamu do projektu.

Chcete-li vytvořit seznam externích dat

  1. Poklikejte na soubor s kódem GenerateExternalDataLists.

  2. Do souboru vložte následující kód.

    Imports Microsoft.VisualStudio.SharePoint
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.IO
    Imports System.Linq
    Imports System.Text
    Imports System.Xml.Linq
    
    Namespace Contoso.SharePointProjectItemExtensions.GenerateExternalDataLists
    
        ' Creates the external data lists for the BDC item. The other part of the partial class 
        ' defines the BDC project item extension.
        Partial Friend Class GenerateExternalDataListsExtension
    
            Private Const ModelFileNameString As String = "ModelFileName"
            Private Const EXTENSION_BDCM As String = ".bdcm"
            Private Const NamespaceString As String = "https://schemas.microsoft.com/windows/2007/BusinessDataCatalog"
            Private Shared ReadOnly BdcNamespace As XNamespace = XNamespace.Get(NamespaceString)
    
            ' Generates an external data list for each Entity in the BDC model. This event handler is called
            ' when the developer clicks the shortcut menu item that the extension adds to the BDC project item.
            Private Sub GenerateExternalDataLists_Execute(ByVal Sender As Object, ByVal e As MenuItemEventArgs)
    
                Dim projectItem As ISharePointProjectItem = CType(e.Owner, ISharePointProjectItem)
                Dim bdcmFile As ISharePointProjectItemFile = GetModelFile(projectItem)
    
                Dim doc As XDocument = XDocument.Load(bdcmFile.FullPath)
                Dim skippedEntities As List(Of XElement) = New List(Of XElement)()
    
                ' Try to generate an external data list for each entity defined in the BDC model file.
                For Each entity As XElement In doc.Root.Elements(BdcNamespace + "LobSystems").Elements( _
                    BdcNamespace + "LobSystem").Elements(BdcNamespace + "Entities").Elements(BdcNamespace + "Entity")
    
                    If False = GenerateExternalDataList(projectItem, entity) Then
                        skippedEntities.Add(entity)
                    End If
                Next
    
                ' Report skipped entities.
                If skippedEntities.Count <> 0 Then
                    Dim entityNameList As StringBuilder = Nothing
                    skippedEntities.ForEach(Function(entity As XElement)
                                                If (entityNameList Is Nothing) Then
                                                    entityNameList = New StringBuilder()
                                                Else
                                                    entityNameList.AppendLine(",")
                                                End If
                                                entityNameList.Append(entity.Attribute("Name").Value)
                                            End Function)
    
                    Dim message As String = String.Format("The following Entities were skipped because " &
                        "either a LobSystemInstance, SpecificFinder, or Finder was not found for them. \r\n{0}", _
                        entityNameList)
                    projectItem.Project.ProjectService.Logger.WriteLine(message, LogCategory.Warning)
                End If
            End Sub
    
            ' Gets the ISharePointProjectItemFile object for the BDC model file.
            Private Function GetModelFile(ByVal projectItem As ISharePointProjectItem) As ISharePointProjectItemFile
    
                Dim modelFileName As String = Nothing
                If projectItem.FeatureProperties.TryGetValue(ModelFileNameString, modelFileName) Then
                    modelFileName = Path.GetFileName(modelFileName)
                    Return (From file In projectItem.Files _
                            Where String.Compare(file.Name, modelFileName, StringComparison.OrdinalIgnoreCase) = 0 _
                            Select file).FirstOrDefault()
                Else
                    ' If we can't find the ModelFileName through the FeatureProperties, 
                    ' get the first file that has a '.bdcm' extension
                    Return (From file In projectItem.Files _
                            Where file.Name.EndsWith(EXTENSION_BDCM, StringComparison.OrdinalIgnoreCase) _
                            Select file).FirstOrDefault()
                End If
            End Function
    
            ' Boilerplate XML for the new list instance that is based on the BDC model.
            Private Const externalDataListContent As String = _
                "<?xml version=""1.0"" encoding=""utf-8""?>" & vbCrLf & _
                "        <Elements https://schemas.microsoft.com/sharepoint/"">" & vbCrLf & _
                "          <ListInstance Title=""$EntityName$DataList""" & vbCrLf & _
                "                        OnQuickLaunch=""TRUE""" & vbCrLf & _
                "                        TemplateType=""104""" & vbCrLf & _
                "                        FeatureId=""$SharePoint.Feature.Id$""" & vbCrLf & _
                "                        Url=""Lists/$EntityName$DataList""" & vbCrLf & _
                "                        Description=""Default List for $EntityName$."">" & vbCrLf & _
                "            <DataSource>" & vbCrLf & _
                "              <Property Name=""LobSystemInstance"" Value=""$LobSystemInstance$"" />" & vbCrLf & _
                "              <Property Name=""EntityNamespace"" Value=""$EntityNamespace$"" />" & vbCrLf & _
                "              <Property Name=""Entity"" Value=""$EntityName$"" />" & vbCrLf & _
                "              <Property Name=""SpecificFinder"" Value=""$SpecificFinder$"" />" & vbCrLf & _
                "              <Property Name=""Finder"" Value=""$Finder$"" />" & vbCrLf & _
                "            </DataSource>" & vbCrLf & _
                "          </ListInstance>" & vbCrLf & _
                "        </Elements>"
    
            ' Tries to generate an external data list for the specified BDC model project item and entity.
            Private Function GenerateExternalDataList(ByVal projectItem As ISharePointProjectItem, ByVal entity As XElement) As Boolean
    
                Dim lobSystemInstanceName As String = GetLobSystemInstanceName(entity)
                Dim specificFinderName As String = GetSpecificFinderName(entity)
                Dim finderName As String = GetFinderName(entity)
                Dim entityName As String = entity.Attribute("Name").Value
    
                If String.IsNullOrEmpty(lobSystemInstanceName) Or String.IsNullOrEmpty(specificFinderName) Or _
                    String.IsNullOrEmpty(finderName) Then
                    Return False
                End If
    
                Dim newExternalDataListName As String = entityName & "DataList"
                Dim existingProjectItem As ISharePointProjectItem = (From existingItem As ISharePointProjectItem In projectItem.Project.ProjectItems
                                                    Where existingItem.Name = newExternalDataListName
                                                    Select existingItem).FirstOrDefault()
    
                ' Add a new list instance and populate it with data from the BDC model.
                If existingProjectItem Is Nothing Then
                    Dim newExternalDataList As ISharePointProjectItem = projectItem.Project.ProjectItems.Add(newExternalDataListName, _
                        "Microsoft.VisualStudio.SharePoint.ListInstance")
    
                    Dim newExternalDataListString As String = externalDataListContent
                    newExternalDataListString = newExternalDataListString.Replace("$EntityName$", entityName)
                    newExternalDataListString = newExternalDataListString.Replace("$LobSystemInstance$", lobSystemInstanceName)
                    newExternalDataListString = newExternalDataListString.Replace("$EntityNamespace$", entity.Attribute("Namespace").Value)
                    newExternalDataListString = newExternalDataListString.Replace("$SpecificFinder$", specificFinderName)
                    newExternalDataListString = newExternalDataListString.Replace("$Finder$", finderName)
    
                    Dim elementsXmlPath As String = Path.Combine(newExternalDataList.FullPath, "Elements.xml")
                    File.WriteAllText(elementsXmlPath, newExternalDataListString)
                    Dim elementsFile As ISharePointProjectItemFile = newExternalDataList.Files.AddFromFile(elementsXmlPath)
                    elementsFile.DeploymentType = DeploymentType.ElementManifest
                End If
    
                Return True
            End Function
    
            Private Function GetLobSystemInstanceName(ByVal entity As XElement) As String
    
                Dim lobSystemInstances As XElement = entity.Parent.Parent.Element(BdcNamespace + "LobSystemInstances")
                If lobSystemInstances IsNot Nothing Then
                    Dim lobSystemInstance As XElement = lobSystemInstances.Elements(BdcNamespace + "LobSystemInstance").FirstOrDefault()
                    If lobSystemInstance IsNot Nothing Then
                        Return lobSystemInstance.Attribute("Name").Value
                    End If
                End If
                Return Nothing
            End Function
    
            Private Function GetSpecificFinderName(ByVal entity As XElement) As String
                Return GetMethodInstance(entity, "SpecificFinder")
            End Function
    
            Private Function GetFinderName(ByVal entity As XElement) As String
                Return GetMethodInstance(entity, "Finder")
            End Function
    
            Private Function GetMethodInstance(ByVal entity As XElement, ByVal methodInstanceType As String) As String
                Dim methods As XElement = entity.Element(BdcNamespace + "Methods")
                If methods IsNot Nothing Then
                    For Each method As XElement In methods.Elements(BdcNamespace + "Method")
                        Dim methodInstances As XElement = method.Element(BdcNamespace + "MethodInstances")
                        If methodInstances IsNot Nothing Then
                            For Each methodInstance As XElement In methodInstances.Elements(BdcNamespace + "MethodInstance")
                                If methodInstance.Attribute("Type").Value = methodInstanceType Then
                                    Return methodInstance.Attribute("Name").Value
                                End If
                            Next
                        End If
                    Next
                End If
                Return Nothing
            End Function
    
        End Class
    End Namespace
    
    using Microsoft.VisualStudio.SharePoint;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    
    namespace Contoso.SharePointProjectItemExtensions.GenerateExternalDataLists
    {
        // Creates the external data lists for the BDC item. The other part of the partial class 
        // defines the BDC project item extension.
        internal partial class GenerateExternalDataListsExtension
        {
            private const string ModelFileNameString = "ModelFileName";
            private const string EXTENSION_BDCM = ".bdcm";
            private const string NamespaceString = "https://schemas.microsoft.com/windows/2007/BusinessDataCatalog";
            private static readonly XNamespace BdcNamespace = XNamespace.Get(NamespaceString);
    
            // Generates an external data list for each Entity in the BDC model. This event handler is called
            // when the developer clicks the shortcut menu item that the extension adds to the BDC project item.
            private void GenerateExternalDataLists_Execute(object sender, MenuItemEventArgs e)
            {
                ISharePointProjectItem projectItem = (ISharePointProjectItem)e.Owner;
                ISharePointProjectItemFile bdcmFile = GetModelFile(projectItem);
    
                XDocument doc = XDocument.Load(bdcmFile.FullPath);
                List<XElement> skippedEntities = new List<XElement>();
    
                // Try to generate an external data list for each entity defined in the BDC model file.
                foreach (XElement entity in doc.Root.Elements(BdcNamespace + "LobSystems").Elements(
                    BdcNamespace + "LobSystem").Elements(BdcNamespace + "Entities").Elements(BdcNamespace + "Entity"))
                {
                    if (!GenerateExternalDataList(projectItem, entity))
                    {
                        skippedEntities.Add(entity);
                    }
                }
    
                // Report skipped entities.
                if (skippedEntities.Count != 0)
                {
                    StringBuilder entityNameList = null;
                    skippedEntities.ForEach(delegate(XElement entity)
                    {
                        if (entityNameList == null)
                        {
                            entityNameList = new StringBuilder();
                        }
                        else
                        {
                            entityNameList.AppendLine(",");
                        }
                        entityNameList.Append(entity.Attribute("Name").Value);
                    });
    
                    string message = string.Format("The following Entities were skipped because either a LobSystemInstance, " +
                        "SpecificFinder, or Finder was not found for them. \r\n{0}", entityNameList);
                    projectItem.Project.ProjectService.Logger.WriteLine(message, LogCategory.Warning);
                }
            }
    
            // Gets the ISharePointProjectItemFile object for the BDC model file.
            private ISharePointProjectItemFile GetModelFile(ISharePointProjectItem projectItem)
            {
                string modelFileName;
                if (projectItem.FeatureProperties.TryGetValue(ModelFileNameString, out modelFileName))
                {
                    modelFileName = Path.GetFileName(modelFileName);
                    return (from file in projectItem.Files
                            where string.Compare(file.Name, modelFileName, StringComparison.OrdinalIgnoreCase) == 0
                            select file).FirstOrDefault();
                }
                else
                {
                    // if we can't find the ModelFileName through the FeatureProperties, 
                    // get the first file that has a '.bdcm' extension
                    return (from file in projectItem.Files
                            where file.Name.EndsWith(EXTENSION_BDCM, StringComparison.OrdinalIgnoreCase)
                            select file).FirstOrDefault();
                }
            }
    
            // Boilerplate XML for the new list instance that is based on the BDC model.
            private const string externalDataListContent =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
                <Elements https://schemas.microsoft.com/sharepoint/"">
                  <ListInstance Title=""$EntityName$DataList""
                                OnQuickLaunch=""TRUE""
                                TemplateType=""104""
                                FeatureId=""$SharePoint.Feature.Id$""
                                Url=""Lists/$EntityName$DataList""
                                Description=""Default List for $EntityName$."">
                    <DataSource>
                      <Property Name=""LobSystemInstance"" Value=""$LobSystemInstance$"" />
                      <Property Name=""EntityNamespace"" Value=""$EntityNamespace$"" />
                      <Property Name=""Entity"" Value=""$EntityName$"" />
                      <Property Name=""SpecificFinder"" Value=""$SpecificFinder$"" />
                      <Property Name=""Finder"" Value=""$Finder$"" />
                    </DataSource>
                  </ListInstance>
                </Elements>";
    
            // Tries to generate an external data list for the specified BDC model project item and entity.
            private bool GenerateExternalDataList(ISharePointProjectItem projectItem, XElement entity)
            {
                string lobSystemInstanceName = GetLobSystemInstanceName(entity);
                string specificFinderName = GetSpecificFinderName(entity);
                string finderName = GetFinderName(entity);
                string entityName = entity.Attribute("Name").Value;
    
                if (string.IsNullOrEmpty(lobSystemInstanceName) || string.IsNullOrEmpty(specificFinderName) || 
                    string.IsNullOrEmpty(finderName))
                {
                    return false;
                }
    
                string newExternalDataListName = entityName + "DataList";
                ISharePointProjectItem existingProjectItem = (from ISharePointProjectItem existingItem in projectItem.Project.ProjectItems
                                                    where existingItem.Name == newExternalDataListName
                                                    select existingItem).FirstOrDefault();
    
                // Add a new list instance and populate it with data from the BDC model.
                if (existingProjectItem == null)
                {
                    ISharePointProjectItem newExternalDataList = projectItem.Project.ProjectItems.Add(newExternalDataListName, 
                        "Microsoft.VisualStudio.SharePoint.ListInstance");
    
                    string newExternalDataListString = externalDataListContent;
                    newExternalDataListString = newExternalDataListString.Replace("$EntityName$", entityName);
                    newExternalDataListString = newExternalDataListString.Replace("$LobSystemInstance$", lobSystemInstanceName);
                    newExternalDataListString = newExternalDataListString.Replace("$EntityNamespace$", entity.Attribute("Namespace").Value);
                    newExternalDataListString = newExternalDataListString.Replace("$SpecificFinder$", specificFinderName);
                    newExternalDataListString = newExternalDataListString.Replace("$Finder$", finderName);
    
                    string elementsXmlPath = Path.Combine(newExternalDataList.FullPath, "Elements.xml");
                    File.WriteAllText(elementsXmlPath, newExternalDataListString);
                    ISharePointProjectItemFile elementsFile = newExternalDataList.Files.AddFromFile(elementsXmlPath);
                    elementsFile.DeploymentType = DeploymentType.ElementManifest;
                }
    
                return true;
            }
    
            private string GetLobSystemInstanceName(XElement entity)
            {
                XElement lobSystemInstances = entity.Parent.Parent.Element(BdcNamespace + "LobSystemInstances");
                if (lobSystemInstances != null)
                {
                    XElement lobSystemInstance = lobSystemInstances.Elements(BdcNamespace + "LobSystemInstance").FirstOrDefault();
                    if (lobSystemInstance != null)
                    {
                        return lobSystemInstance.Attribute("Name").Value;
                    }
                }
                return null;
            }
    
            private string GetSpecificFinderName(XElement entity)
            {
                return GetMethodInstance(entity, "SpecificFinder");
            }
    
            private string GetFinderName(XElement entity)
            {
                return GetMethodInstance(entity, "Finder");
            }
    
            private string GetMethodInstance(XElement entity, string methodInstanceType)
            {
                XElement methods = entity.Element(BdcNamespace + "Methods");
                if (methods != null)
                {
                    foreach (XElement method in methods.Elements(BdcNamespace + "Method"))
                    {
                        XElement methodInstances = method.Element(BdcNamespace + "MethodInstances");
                        if (methodInstances != null)
                        {
                            foreach (XElement methodInstance in methodInstances.Elements(BdcNamespace + "MethodInstance"))
                            {
                                if (methodInstance.Attribute("Type").Value == methodInstanceType)
                                {
                                    return methodInstance.Attribute("Name").Value;
                                }
                            }
                        }
                    }
                }
    
                return null;
            }
        }
    }
    

Checkpoint

V tomto okamžiku návodu je celý kód pro rozšíření položky projektu v projektu. Sestavte řešení, abyste se ujistili, že se projekt zkompiluje bez chyb.

Sestavte řešení

  • V nabídce Sestavit zvolte Sestavit řešení.

Vytvoření balíčku VSIX k nasazení rozšíření položky projektu

Chcete-li nasadit rozšíření, použijte VSIX projekt ve vašem řešení k vytvoření VSIX balíčku. Nejprve nakonfigurujte VSIX balíček úpravou souboru source.extension.vsixmanifest, který je součástí projektu VSIX. Potom vytvořte VSIX balíček vytvořením řešení.

Chcete-li konfigurovat a vytvořit balíček VSIX

  1. V Průzkumníku řešení poklikejte na soubor source.extension.vsixmanifest v projektu GenerateExternalDataLists.

    Visual Studio otevře soubor v editoru manifestu. Soubor source.extension.vsixmanifest je základem pro soubor extension.vsixmanifest a je vyžadován pro všechny balíčky VSIX. Další informace o tomto souboru získáte v tématu VSX Schema for Extensions.

  2. V poli Název produktu napište Generátor seznamu externích dat.

  3. V poli Autor napište Contoso.

  4. V poli Popis napište Rozšíření pro projekt Model Připojení obchodních dat, který může být použit pro vygenerování seznamu externích dat.

  5. V oddílu Obsah editoru klikněte na tlačítko Přidání obsahu.

  6. V dialogovém okně Přidání obsahu v seznamu Volba typu obsahu zvolte Komponenta MEF.

    Poznámka

    Tato hodnota odpovídá prvku MefComponent v souboru extension.vsixmanifest file. Tento prvek určuje název sestavení rozšíření v balíčku VSIX. Další informace naleznete v tématu MEFComponent Element (VSX Schema).

  7. Pod Vybrat zdroj, klepněte projektu rádiové tlačítko a vyberte BdcProjectItemExtension v seznamu vedle něj.

  8. Klepněte na tlačítko OK.

  9. V nabídce Build (Sestavit) klepněte na příkaz Build Solution (Sestavit řešení). Přesvědčte se, zda je projekt zkompilován bez chyb.

  10. Otevřete složku výstupu sestavení pro projekt GenerateExternalDataLists. Ujistěte se, zda tato složka nyní obsahuje soubor GenerateExternalDataLists.vsix.

    Ve výchozím nastavení je výstupní složka sestavení \bin\Debug složka pod složkou, která obsahuje soubor projektu.

Testování rozšíření položky projektu

Nyní jste připraveni k testování rozšíření položky projektu. Nejprve spusťte ladění rozšíření projektu v experimentální instanci aplikace Visual Studio. Potom použijte rozšíření v experimentální instanci Visual Studio k vytvoření externího seznamu pro model služby BDC. Nakonec otevřete externí seznam na webu služby SharePoint pro ověření, zda funguje podle očekávání.

Chcete-li začít ladit rozšíření

  1. Restartujte aplikaci Visual Studio s oprávněními správce a otevřete řešení GenerateExternalDataLists.

  2. V projektu BdcProjectItemExtension otevřete soubor s kódem ProjectItemExtension a přidat zarážku do řádku kódu v metodě Initialize.

  3. Otevřete soubor s kódem GenerateExternalDataLists a na první řádek kódu přidejte zarážku v metodě GenerateExternalDataLists_Execute.

  4. Stiskněte F5 pro spuštění ladění.

    Visual Studio nainstaluje rozšíření do %UserProfile%\AppData\Local\Microsoft\VisualStudio\10.0Exp\Extensions\Contoso\External Data List Generator\1.0 a spustí experimentální instanci Visual Studio. Položku projektu budete testovat v této instanci aplikace Visual Studio.

Chcete-li testovat rozšíření

  1. V experimentální instanci Visual Studio v nabídce Soubor vyberte Nový a potom klikněte na Projekt.

  2. Rozbalte Visual C#, rozbalte SharePoint a potom klikněte na 2010.

  3. V poli se seznamem v horní části dialogového okna zkontrolujte, zda je vybráno .NET framework 3.5. Projekty pro Microsoft SharePoint Server 2010 vyžadují tuto verzí rozhraní .NET Framework.

  4. V seznamu šablon projektů klikněte na položku Model Připojení obchodních dat.

  5. Do pole Název zadejte TestBDCModel.

  6. Klepněte na tlačítko OK.

  7. V Průvodce nastavením služby SharePoint zadejte adresu URL webu, který chcete použít k ladění a klikněte na tlačítko Dokonce.

  8. Ověřte, že se kód ve druhé instanci aplikace Visual Studio zastaví na zarážce, kterou jste nastavili výše v metodě Initialize. Stisknutím F5 v této instanci aplikace Visual Studio pokračujte v ladění projektu.

  9. Stiskněte v experimentální instanci aplikace Visual Studio F5 k sestavení, nasazení a spuštění projektu TestBDCModel. Webový prohlížeč otevře výchozí stránku webu služby SharePoint, která se používá pro ladění.

  10. Ověřte, zda oddíl Seznamy v oblast Snadné spuštění ještě neobsahuje seznam, který je založen na výchozím modelu služby BDC v projektu. Je nutné nejprve vytvořit externí datový seznam, buď uživatelským rozhraním služby SharePoint nebo rozšířením položky projektu.

  11. Zavřete webový prohlížeč.

  12. V instanci aplikace Visual Studio, která má otevřen projekt TestBDCModel, klikněte pravým tlačítkem myši na uzel BdcModel1 v Průzkumníku řešení a klikněte na Generovat seznam externích dat.

  13. Ověřte, že se kód ve druhé instanci aplikace Visual Studio zastaví na zarážce, kterou jste nastavili výše v metodě GenerateExternalDataLists_Execute. Stisknutím F5 pokračujte v ladění projektu.

  14. Experimentální instance aplikace Visual Studio přidá instanci seznamu s názvem Entity1DataList do projektu TestBDCModel a také vytváří funkci s názvem Feature2 pro instanci seznamu.

  15. Stiskněte F5 k vytvoření, nasazení a spuštění projektu TestBDCModel. Webový prohlížeč otevře výchozí stránku webu služby SharePoint, která se používá pro ladění.

  16. Ověřte, zda oddíl Seznamy na panelu Snadné spuštění nyní obsahuje seznam s názvem Entity1DataList.

  17. Klikněte na seznam Entity1DataList.

  18. Přesvědčte se, že seznam obsahuje sloupce s názvem Identifier1 a Message a jednu položku Identifier1 s hodnotou 0 a Message s hodnotou Hello World. Všechna tato data pochází od modelu výchozí služby BDC, která je generována šablonou projektu Model Připojení obchodních dat.

  19. Zavřete webový prohlížeč.

Čištění vývojového počítače

Po dokončení testování rozšíření položky projektu odstraňte externí seznam a model služby BDC z webu služby SharePoint a odeberte rozšíření položky projektu z Visual Studio.

Chcete-li odebrat seznam externích dat z webu služby SharePoint

  1. V panelu Snadné spuštění webu služby SharePoint klikněte na seznam Entity1DataList.

  2. V pásu karet na webu služby SharePoint klikněte na záložku Seznam.

  3. Na záložce Seznam ve skupině Nastavení klikněte na Nastavení seznamu.

  4. Pod Oprávnění a Správa klikněte Odstranit tento seznam. Klikněte na tlačítko OK k potvrzení, že chcete odeslat seznam do odpadkového koše.

  5. Zavřete webový prohlížeč.

Chcete-li odebrat model služby BDC z webu služby SharePoint

  • V experimentální instanci Visual Studio v nabídce Sestavení klikněte na tlačítko Odvolání.

    Visual Studio odebere model služby BDC z webu služby SharePoint.

Chcete-li odebrat rozšíření položky projektu z aplikace Visual Studio

  1. V experimentální instanci Visual Studio v nabídce Nástroje klikněte na tlačítko Správce rozšíření.

    Otevře se okno Správce rozšíření.

  2. V seznamu rozšíření klikněte na položku Generátor seznamu externích dat a potom klikněte na tlačítko Odinstalovat.

  3. V dialogovém okně, které se objeví, klikněte na tlačítko Ano pro potvrzení, že chcete odinstalovat rozšíření.

  4. Klikněte na Restartovat nyní pro dokonční odinstalace.

  5. Zavřete obě instance programu Visual Studio (experimentální instanci aplikace Visual Studio a instanci obsahující otevřené řešení GenerateExternalDataLists).

Viz také

Koncepty

Rozšíření systému projektů služby SharePoint

Další zdroje

Creating a Business Data Connectivity Model

Designing a Business Data Connectivity Model