Sdílet prostřednictvím


Návod: 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í balíčku rozšíření Visual Studio (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 Visual Studio.

  2. Na panelu nabídky vyberte možnosti Soubor, Nový, Projekt.

  3. V dialogovém okně Nový projekt rozbalte uzel 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 SDK.Další informace naleznete v oddílu požadavky dříve v tomto tématu.

  4. V seznamu v horní části dialogového okna Nový projekt zvolte .NET framework 4.5.

    Rozšíření nástrojů SharePoint vyžaduje funkce této verze rozhraní .NET Framework.

  5. Zvolte šablonu Projekt VSIX.

  6. Do pole Název zadejte GenerateExternalDataLists a poté klikněte na tlačítko OK.

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

  7. Pokud se soubor source.extension.vsixmanifest neotevře automaticky, otevřete jeho místní nabídku v projektu GenerateExternalDataLists a zvolte možnost Otevřít

  8. Ověřte, zda soubor source.extension.vsixmanifest obsahuje neprázdnou položku (zadejte Contoso) pro pole Autor, uložte soubor a zavřete jej.

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

  1. Průzkumníku řešení otevřete místní nabídku uzlu řešení GenerateExternalDataLists a vyberte položky Přidat a 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ě Přidat nový projekt rozbalte uzel Visual C# nebo Visual Basic a potom klikněte na uzel Windows.

  3. V seznamu v horní části dialogového okna zvolte Rozhraní .NET framework 4.5.

  4. V seznamu šablon projektu vyberte možnost Knihovna tříd.

  5. Do pole Název zadejte BdcProjectItemExtension a poté klikněte na tlačítko OK.

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

  6. 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 sestavení do projektu rozšíření.

Chcete-li konfigurovat projekt

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

    • ProjectItemExtension

    • GenerateExternalDataLists

  2. Zvolte projekt BdcProjectItemExtension a poté na panelu nabídky zvolte Projekt, Přidání odkazu.

  3. V uzlu Sestavení zvolte uzel Rozhraní a pak zaškrtněte políčko pro každé následující sestavení:

    • System.ComponentModel.Composition

    • WindowsBase

  4. V uzlu Sestavení zvolte uzel Rozšíření a pak zaškrtněte políčko pro následující sestavení:

    • Microsoft.VisualStudio.SharePoint
  5. Klikněte na tlačítko OK.

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

  • Vložte následující kód do souboru s kódem ProjectItemExtension.

    [!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ždou entitu 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

  • Vložte následující kód do souboru s kódem GenerateExternalDataLists.

    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;
            }
        }
    }
    

Kontrolní bod

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.

Sestavení řešení

  • V panelu nabídek zvolte Sestavit, 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í.

Konfigurace a vytvoření balíčku VSIX

  1. V Průzkumníku řešení otevřete místní nabídku pro soubor source.extension.vsixmanifest v projektu GenerateExternalDataLists a vyberte Otevřít.

    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 VSIX rozšíření schématu Reference.

  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 položky projektu Model Připojení obchodních dat, který může být použit pro vygenerování seznamu externích dat.

  5. Na kartě Aktiva editoru zvolte tlačítko Nové.

    Zobrazí se dialogové okno Přidat nové aktivum.

  6. V seznamu Typ zvolte Microsoft.VisualStudio.MefComponent.

    [!POZNÁMKA]

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

  7. V seznamu Zdroje zvolte Projekt v aktuálním řešení.

  8. V seznamu Projekt vyberte možnost BdcProjectItemExtension a klikněte na tlačítko OK.

  9. V panelu nabídek zvolte Sestavit, Sestavit řešení.

  10. Ujistěte se, že se projekt zkompiluje a sestaví bez chyb.

  11. Ujistěte se, že výstupní složka sestavení pro projekt GenerateExternalDataLists nyní obsahuje soubor GenerateExternalDataLists.vsix.

    Výchozí výstupní složka sestavení je složka ..\bin\Debug 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í projektu rozšíření 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. Pokud je to nutné, 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řidejte 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. Zahajte ladění zvolením klávesy F5 nebo zvolením možnosti Ladění, Zahájit ladění na panelu nabídky.

    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 na panelu nabídky zvolte Soubor, Nový, Projekt.

  2. V dialogovém okně Nový projekt rozbalte uzel Šablony nebo rozbalte uzel Visual C#, uzel SharePoint a poté zvolte 2010.

  3. V seznamu 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 projektu vyberte možnost Projekt SharePoint 2010.

  5. Do pole Název zadejte SharePointProjectTestBDC a poté klikněte na tlačítko OK.

  6. Do Průvodce nastavením služby SharePoint zadejte adresu URL webu, který chcete použít k ladění, zvolte Nasadit jako řešení farmy a pak zvolte tlačítko Dokončit.

  7. Otevřete místní nabídku projektu SharePointProjectTestBDC, vyberte položku Přidat a poté položku Nová položka.

  8. V dialogovém okně Přidat NewItem – SharePointProjectTestBDC rozbalte uzel nainstalovaného jazyka, rozbalte uzel SharePoint.

  9. Zvolte uzel 2010 a poté šablonu Model připojení obchodních dat (pouze řešení farmy).

  10. Do textového pole Název zadejte TestBDCModel a poté klikněte na tlačítko Přidat.

  11. Ověřte, že se kód ve druhé instanci aplikace Visual Studio zastaví na zarážce, kterou jste nastavili v metodě Initialize souboru kódu ProjectItemExtension.

  12. V zastavené instanci Visual Studio zvolte klávesu F5 nebo v řádku nabídek zvolte Ladit, Pokračovat a pokračujte v ladění projektu.

  13. V experimentální instanci Visual Studio zvolte klávesu F5 nebo v řádku nabídek zvolte Ladit, Spustit ladění k sestavení, nasazení a spuštění projektu TestBDCModel.

    Webový prohlížeč otevře výchozí stránku webu služby SharePoint, která je určena pro ladění.

  14. 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.

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

  16. V instanci aplikace Visual Studio, která má otevřen projekt TestBDCModel, otevřete místní nabídku uzlu TestBDCModel v Průzkumníku řešení a poté zvolte Generovat seznam externích dat.

  17. Ověřte, že se kód ve druhé instanci aplikace Visual Studio zastaví na zarážce, kterou jste nastavili v metodě GenerateExternalDataLists_Execute.Zvolte klávesu F5 nebo v řádku nabídek zvolte Ladění, Pokračovat a pokračujte v ladění projektu.

  18. 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.

  19. Zvolte klávesu F5 nebo v řádku nabídek zvolte Ladit, Spustit ladění 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í.

  20. V části Seznamy v oblasti Snadné spuštění zvolte seznam Entity1DataList.

  21. Přesvědčte se, že seznam obsahuje sloupce s názvem Identifier1 a Message a jednu položku s názvem Identifier1 s hodnotou 0 a Message s hodnotou Hello World.

    Šablona projektu Model připojení obchodních dat generuje výchozí model BDC, který poskytuje všechna tato data.

  22. 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.

Odebrat seznam externích dat z webu služby SharePoint

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

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

  3. Na záložce Seznam ve skupině Nastavení zvolte Nastavení seznamu.

  4. V části Oprávnění a správa zvolte možnost Odstranit tento seznam a pak zvolte OK, a potvrďte tak, že chcete odeslat seznam do odpadkového koše.

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

Odebrat model služby BDC z webu služby SharePoint

  • V experimentální instanci Visual Studio na panelu nabídky zvolte Sestavení, Odvolání.

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

Odebrat rozšíření položky projektu z aplikace Visual Studio

  1. V experimentální instanci Visual Studio na panelu nabídky zvolte Tools, Rozšíření a aktualizace.

    Otevře se dialogové okno Aktualizace a rozšíření.

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

  3. V dialogovém okně, které se objeví, zvolte Ano pro potvrzení, že chcete odinstalovat rozšíření.

  4. Zvolením možnosti Restartovat nyní dokončete odinstalaci.

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

Viz také

Koncepty

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

Další zdroje

Vytvoření modelu připojení obchodních dat

Navrhování modelu připojení obchodních dat