簡體   English   中英

Microsoft Dynamics CRM 2011

[英]Microsoft Dynamics CRM 2011

Dynamics CRM中的IOrganizationServiceOrganizationServiceProxy有什么區別?

它是否與在Crm上下文和Crm上下文中訪問服務有關?

最簡單的答案是IOrganizationService是一個接口,而OrganizationServiceProxy是一個實現IOrganizationService接口的類。 這意味着默認情況下,IOrganizationService上的任何屬性/方法也可通過OrganizationServiceProxy獲得。

如果在插件或自定義工作流活動的上下文中運行,它將允許您訪問可用於詢問CRM的IOrganizationService。

如果您正在編寫外部程序,例如Windows服務或獨立應用程序,那么通常使用類OrganizationServiceProxy來建立與CRM Web服務的連接。 顯然,您可以稍后將其分配給IOrganizationService(例如依賴注入/用於單元測試)。 或者,如果您願意,沒有理由繼續使用OrganizationServiceProxy。

IOrganisationService在插件和自定義工作流活動中使用,並從執行上下文派生。

OrganisationServiceProxy主要用於在Dynamics CRM應用程序之外運行的代碼。

如果您正在使用sdk程序集(特別是microsoft.xrm.sdk.dll),那么您將使用IOrganizationService的實現,並且調用時間將是相同的。 OrganizationServiceProxy的主要目的是提供在CRM外部運行的代碼中建立與CRM連接的選項.OrganioServiceProxy類實現IOrganizationService並為組織服務提供經過身份驗證的WCF通道

OrganizationService是一個更高級別的類,它提供更豐富的客戶端功能,並在其中實際使用OrganizationServiceProxy

包含此更高級別API的Microsoft.Xrm.Client程序集不能在插件等中使用,但適用於富客戶端和ASP.NET。

值得注意的是,Microsoft.Xrm.Client程序集已從CRM2016 SDK中刪除。 對於2016項目,您可以考慮使用XRM Toolking程序集。

請參見msdn.microsoft.com/.../dn689057.aspx

它具有與連接管理器相似的功能-msdn.microsoft.com/.../mt608573.aspx

OrganizationServiceProxy是IOrganizationService的實現。 它與List是接口IList的實現類似。 如果要談論為什么在地球上除了測試之外,微軟還提供接口和實現,我可以提出一個在我生命中發生的有趣案例。 我需要重新閱讀動態crm的信息。 在我的情況下,OrganizationServiceProxy過期更快,然后從CRM收到信息。 為了解決這個問題,我創建了以下門面:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;

    namespace OrganizationService
    {
        public delegate IOrganizationService CreateOrganizationServiceFunc(string organizationServiceUrl, string userName, string password, TimeSpan? timeout = null, bool useSSL = false);
        public class OrganizationServiceFacade : IOrganizationService
        {
            private IOrganizationService _serviceInternal { get; set; }

            private CreateOrganizationServiceFunc _creator;

            Func<IOrganizationService> _orgServiceFactory;
            public OrganizationServiceFacade(Func<IOrganizationService> orgServiceFactory)
            {
                _orgServiceFactory = orgServiceFactory;
                CreateService();
            }

            private void CreateService()
            {
                _serviceInternal = _orgServiceFactory();
            }

            public void Associate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)
            {
                try
                {
                    _serviceInternal.Associate(entityName, entityId, relationship, relatedEntities);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    _serviceInternal.Associate(entityName, entityId, relationship, relatedEntities);
                }
            }

            public Guid Create(Entity entity)
            {
                Guid result;
                try
                {
                    result = _serviceInternal.Create(entity);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    result = _serviceInternal.Create(entity);
                }
                return result;
            }

            public void Delete(string entityName, Guid id)
            {
                try
                {
                    _serviceInternal.Delete(entityName, id);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    _serviceInternal.Delete(entityName, id);
                }
            }

            public void Disassociate(string entityName, Guid entityId, Relationship relationship, EntityReferenceCollection relatedEntities)
            {
                try
                {
                    _serviceInternal.Disassociate(entityName, entityId, relationship, relatedEntities);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    _serviceInternal.Disassociate(entityName, entityId, relationship, relatedEntities);
                }
            }

            public OrganizationResponse Execute(OrganizationRequest request)
            {
                try
                {
                    return _serviceInternal.Execute(request);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    return _serviceInternal.Execute(request);
                }
            }

            public Entity Retrieve(string entityName, Guid id, ColumnSet columnSet)
            {
                try
                {
                    return _serviceInternal.Retrieve(entityName, id, columnSet);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    return _serviceInternal.Retrieve(entityName, id, columnSet);
                }
            }

            public EntityCollection RetrieveMultiple(QueryBase query)
            {
                try
                {
                    return _serviceInternal.RetrieveMultiple(query);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    return _serviceInternal.RetrieveMultiple(query);
                }
            }

            public void Update(Entity entity)
            {
                try
                {
                    _serviceInternal.Update(entity);
                }
                catch (System.ServiceModel.Security.MessageSecurityException mex)
                {
                    CreateService();
                    _serviceInternal.Update(entity);
                }
            }
        }
    }

然后我有簡單的重新連接機制:

        Trace.TraceInformation("Creation of CRM connection");
        for (var maxTry = 0; maxTry < reconectionTries; maxTry++)
        {
            try
            {
                var service = new OrganizationServiceFacade(() =>
                    XrmServiceCreator.CreateOrganizationService("organizationServiceUrl",
                        "username",
                        "userpassword",
                        DefaultTimeout));

                var response = (WhoAmIResponse) service.Execute(new WhoAmIRequest());
                if (response.Results.Count == 0)
                {
                    throw new InvalidDataException($"CRM returned no data in response. Number of retries is: {maxTry}, user name: {ConfigSettings.Default.RunAsUser}, Default timeout = {DefaultTimeout}");
                }

                return service;
            }
            catch (Exception e)
            {
                Trace.TraceError("Exception: {0}", e);
            }
        }

方法XrmServiceCreator.CreateOrganizationService返回IOrganizationService的實例,並在窗簾后面創建OrganizationServiceProxy的實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM