【问题标题】:How can i use engine object in my console application如何在控制台应用程序中使用引擎对象
【发布时间】:2012-07-13 15:25:49
【问题描述】:

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

我不应该使用 ITemplate-interface 和 Transform-Method。

我正在使用 Tridion 2011

谁能推荐我。

【问题讨论】:

  • 您能解释一下您的用例是什么以及您在做什么吗?一个友好的建议,你提供的信息越多,你就会得到更好的答案。对于您的用例,可能是引擎不是正确的设计方法,除非您解释您要实现的目标以及已经完成的工作,否则我不知道。

标签: tridion tridion-2011


【解决方案1】:

你不能。 Engine 类是 TOM.NET 的一部分,该 API 明确保留用于:

  1. 模板构建块
  2. 事件处理程序

对于所有其他情况(例如控制台应用程序),您应该使用核心服务。

已经有很多很好的问题(以及其他网站上的文章):

如果您在此过程中遇到困难,请向我们展示您拥有的相关代码+配置以及您收到的错误消息(或您在哪一步遇到困难),我们会尽力提供帮助。

【讨论】:

    【解决方案2】:

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

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

    构造一个数据对象,例如一个组件,您可以实现一个组件生成器类,该类实现一个为您执行此操作的创建方法:

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

    希望这能让你开始。

    【讨论】:

    • +1 用于通过空合并运算符和传递赋值的延迟加载。会偷那个。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2010-11-05
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多