5

我在这里看到了一些与此主题相关的问题/答案,但是我仍然没有得到我想要的建议。所以我再次在这里发布我的问题,我会感谢你宝贵的时间和答案。

我想通过在 SDL Tridion Content Manager 中以编程方式创建“组件、页面、SG、出版物、文件夹”,然后,我想在页面中添加以编程方式创建的组件并为该页面附加 CT、PT,最后将喜欢以编程方式发布页面。

我已经使用 TOM API(互操作 DLL)在 SDL Tridion 2009 中完成了这些所有活动,并使用 TOM.Net API 在 SDL Tridion 2011 中尝试了这些活动。它不起作用,后来我才知道,TOM.Net API 不支持这些类型的工作,它专门用于模板和事件系统。最后我开始知道我必须使用核心服务来做这些事情。

我的问题:

  1. 当我创建控制台应用程序以使用核心服务以编程方式创建组件时,我必须添加哪些 DLL 作为参考?
  2. 之前,我已经创建了exe并在TCM服务器中运行,exe创建了所有的东西,我也可以使用相同的方法使用核心服务吗?它会起作用吗?
  3. BC 是否仍然可用或核心服务已取代 BC?(BC-业务连接器)
  4. 任何人都可以发送一些代码片段来创建组件/页面(完整的类文件将有助于更好地理解)
4

3 回答 3

6
  1. 您只需要引用 Tridion.ContentManager.CoreService.Client.dll。您可能希望引用 Tridion.Common.dll 来访问一些有用的类,例如TcmUri,但这不是必需的。
  2. 您的客户端程序将与您指定的机器上的核心服务建立显式连接。如果操作正确,您可以在与 Tridion Content Manager 相同的机器上或不同的机器上运行客户端。
  3. Business Connector 仍然可用,但已被核心服务取代。
  4. 看看这些链接:

使用 SDL Tridion 2011 中的核心服务更新组件

在 SDL Tridion 2011 中,如何使用核心服务处理项目的元数据?

以及关于从 .NET 连接到核心服务的主题的标准文档。

如果您需要有关代码的更多帮助,我建议您向我们展示您已经编写的代码并解释什么不起作用。

于 2012-05-31T10:38:14.997 回答
4

我将尝试回答您的问题:

  1. 您必须引用 Tridion.ContentManager.CoreService.Client 并向 app.config 添加一些内容。这里有描述

  2. 它可以在 CM 服务器以及任何其他机器上工作,只要它可以访问 CoreService

  3. CoreService 是 BC 的替代品。BC 已弃用,很快将被删除
  4. 您将从这里获得所有基本信息。

这应该足以让您开始。如果您有具体问题 - 将它们作为单独的问题发布。

于 2012-05-31T10:36:58.037 回答
1

我如何在我的控制台应用程序中使用引擎对象

从控制台应用程序中,您应该使用核心服务。我写了一个小例子,使用核心服务在内容管理器中搜索项目。

Console.WriteLine("FullTextQuery:");

var fullTextQuery = Console.ReadLine();

if (String.IsNullOrWhiteSpace(fullTextQuery) || fullTextQuery.Equals(":q", StringComparison.OrdinalIgnoreCase))
{
    break;
}

Console.WriteLine("SearchIn IdRef:");

var searchInIdRef = Console.ReadLine();

var queryData = new SearchQueryData
                    {
                        FullTextQuery = fullTextQuery,
                        SearchIn = new LinkToIdentifiableObjectData
                                        {
                                            IdRef = searchInIdRef
                                        }
                    };

var results = coreServiceClient.GetSearchResults(queryData);
results.ToList().ForEach(result => Console.WriteLine("{0} ({1})", result.Title, result.Id));

将对 Tridion.ContentManager.CoreService.Client 的引用添加到您的 Visual Studio 项目中。

核心服务客户端提供者代码:

public interface ICoreServiceProvider
{
    CoreServiceClient GetCoreServiceClient();
}

public class CoreServiceDefaultProvider : ICoreServiceProvider
{
    private CoreServiceClient _client;

    public CoreServiceClient GetCoreServiceClient()
    {
        return _client ?? (_client = new CoreServiceClient());
    }
}

和客户本身:

public class CoreServiceClient : IDisposable
{
    public SessionAwareCoreServiceClient ProxyClient;

    private const string DefaultEndpointName = "netTcp_2011";

    public CoreServiceClient(string endPointName)
    {
        if(string.IsNullOrWhiteSpace(endPointName))
        {
            throw new ArgumentNullException("endPointName", "EndPointName is not specified.");
        }

        ProxyClient = new SessionAwareCoreServiceClient(endPointName);
    }

    public CoreServiceClient() : this(DefaultEndpointName) { }

    public string GetApiVersionNumber()
    {
        return ProxyClient.GetApiVersion();
    }

    public IdentifiableObjectData[] GetSearchResults(SearchQueryData filter)
    {
        return ProxyClient.GetSearchResults(filter);
    }

    public IdentifiableObjectData Read(string id)
    {
        return ProxyClient.Read(id, new ReadOptions());
    }

    public ApplicationData ReadApplicationData(string subjectId, string applicationId)
    {
        return ProxyClient.ReadApplicationData(subjectId, applicationId);
    }

    public void Dispose()
    {
        if (ProxyClient.State == CommunicationState.Faulted)
        {
            ProxyClient.Abort();
        }
        else
        {
            ProxyClient.Close();
        } 
    }
}

当您想通过核心服务执行 CRUD 操作时,您可以在客户端中实现以下方法:

public IdentifiableObjectData CreateItem(IdentifiableObjectData data)
{
    data = ProxyClient.Create(data, new ReadOptions());
    return data;
}

public IdentifiableObjectData UpdateItem(IdentifiableObjectData data)
{
    data = ProxyClient.Update(data, new ReadOptions());
    return data;
}

public IdentifiableObjectData ReadItem(string id)
{
    return ProxyClient.Read(id, new ReadOptions());
}

要构造例如 Component 的数据对象,您可以实现 Component Builder 类,该类实现为您执行此操作的 create 方法:

public ComponentData Create(string folderUri, string title, string content)
{
    var data = new ComponentData()
                    {
                        Id = "tcm:0-0-0",
                        Title = title,
                        Content = content,
                        LocationInfo = new LocationInfo()
                    };

    data.LocationInfo.OrganizationalItem = new LinkToOrganizationalItemData
    {
        IdRef = folderUri
    };

using (CoreServiceClient client = provider.GetCoreServiceClient())
{
    data = (ComponentData)client.CreateItem(data);
}

    return data;
}

希望这能让你开始。

于 2012-07-16T10:03:59.703 回答