1. 程式人生 > >Dynamics Plugin 初始化和常用方法

Dynamics Plugin 初始化和常用方法

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace Utility
{
    public class PluginServiceProvider
    {
        public int Index = 1;
        public ITracingService TracingService { get; set; }
        public IPluginExecutionContext Context { get; set; }
        public IOrganizationServiceFactory ServiceFactory { get; set; }
        public IOrganizationService UserService { get; set; }
        public IOrganizationService SysService { get; set; }

        public PluginServiceProvider() { }

        /// <summary>
        /// Plugin的例項,或取Plugin物件。
        /// </summary>
        /// <param name="serviceProvider">Execute IServiceProvider型別的引數</param>
        public PluginServiceProvider(IServiceProvider serviceProvider)
        {
            TracingService = GetService<ITracingService>(serviceProvider);
            Context = GetService<IPluginExecutionContext>(serviceProvider);//上下文
            ServiceFactory = GetService<IOrganizationServiceFactory>(serviceProvider);
            SysService = this.ServiceFactory.CreateOrganizationService(null);//管理員許可權
            UserService = this.ServiceFactory.CreateOrganizationService(this.Context.UserId);//使用者許可權
        }

        /// <summary>
        /// 實體所處狀態
        /// </summary>
        /// <param name="entityName">實體名稱</param>
        /// <param name="action">create,update,,delete</param>
        /// <param name="state">20(pre),40(post) </param>
        /// <returns></returns>
        public bool EqualEntityName_Action_State(string entityName, string action, int state)
        {
            CheckNull(Context, "IPluginExecutionContext");
            return Context.PrimaryEntityName.ToLower().Equals(entityName.ToLower()) &&
                Context.MessageName.ToLower().Equals(action.ToLower()) && Context.Stage == state;
        }
        /// <summary>
        /// 實體所處狀態
        /// </summary>
        /// <param name="state">20(pre),40(post) </param>
        /// <param name="Action">create,update,,delete</param>
        /// <returns></returns>
        public bool EqualAction_Or_MessageName(int state, string Action)
        {
            TracingService.Trace("EqualAction_Or_MessageName");
            if (Context.Stage == state)
            {
                if (Action != null && Action.ToLower() == Context.MessageName.ToLower())
                {
                    return true;
                }
            }

            return false;
        }


        /// <summary>
        /// 判斷實體的欄位是否為空
        /// </summary>
        /// <param name="en">實體物件</param>
        /// <param name="name">欄位name</param>
        /// <returns></returns>
        public bool IsNotNull(Entity en, string name)
        {
            return en.Contains(name) && IsNotNull(en[name]);
        }


        //獲取當前使用者的語言
        public int? GetCurrentUserLanguageId()
        {
            IOrganizationService service = SysService;
            Guid userid = Context.UserId;
            QueryExpression mySavedQuery = new QueryExpression
            {
                ColumnSet = new ColumnSet("systemuserid", "uilanguageid"),
                EntityName = "usersettings",
                Criteria = new FilterExpression()
                {
                    FilterOperator = Microsoft.Xrm.Sdk.Query.LogicalOperator.And,
                    Conditions =  
                {        
                    new ConditionExpression  
                    {  
                        AttributeName = "systemuserid",  
                        Operator = ConditionOperator.Equal,  
                        Values = {userid}  
                    }  
                }
                }
            };

            EntityCollection ec = service.RetrieveMultiple(mySavedQuery);
            if (ec != null && ec.Entities != null && ec.Entities.Count > 0 && ec.Entities[0].Contains("uilanguageid"))
            {
                return (int)(ec.Entities[0]["uilanguageid"]);
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 外掛回滾,彈出訊息。
        /// </summary>
        /// <param name="msg">訊息類容</param>
        public void MessageShow(string msg)
        {
            throw new InvalidPluginExecutionException(msg);
        }

        /// <summary>
        /// 錯誤日誌
        /// </summary>
        /// <param name="error">錯誤資訊</param>
        /// <param name="filepath">錯誤資訊儲存路徑</param>
        public static void WriteError(string error, string filepath)
        {
            string logpath = "D:\\DXC\\interface\\crm";
            if (filepath != null && !string.IsNullOrEmpty(filepath)) { logpath = filepath; }
            System.IO.StreamWriter sr;
            string logFilePath = logpath + "_" + DateTime.Today.ToString("yyyy-MM-dd") + ".log";
            if (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(logFilePath)) == false)
            {
                System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(logFilePath));
            }
            if (System.IO.File.Exists(logFilePath))
            {
                sr = System.IO.File.AppendText(logFilePath);
            }
            else
            {
                sr = System.IO.File.CreateText(logFilePath);
            }
            sr.WriteLine(DateTime.Now.ToString("--------yyyy/MM/dd HH:mm:ss--------"));
            sr.WriteLine(error);
            sr.Close();
        }
 


        public void CheckNull(object o, string name)
        {
            if (o == null)
            {
                throw new InvalidPluginExecutionException(name + " is null!");
            }
        }

      

        public T GetService<T>(IServiceProvider serviceProvider)
        {
            return (T)serviceProvider.GetService(typeof(T));
        }

        public bool IsNotNull(object o)
        {
            return o != null && o != DBNull.Value && !string.IsNullOrEmpty(o.ToString());
        }

        public bool IsEntity()
        {
            CheckNull(Context, "IPluginExecutionContext");
            return Context.InputParameters.Contains("Target");
        }

        public bool EqualCurrentEntity(string name)
        {
            return IsEntity() && GetCurrentEntityName() == name.ToLower();
        }

        public string GetCurrentEntityName()
        {
            CheckNull(Context, "IPluginExecutionContext");
            return Context.PrimaryEntityName.ToLower();
        }
    } 
}

Demo

using System;
using Microsoft.Xrm.Sdk;
using Utility;

namespace ProjectnamechangeManage
{
    public class new_projectnamechange_CreatePre:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            string entityName = "entityname";
            PluginServiceProvider plugin = new PluginServiceProvider(serviceProvider);
            //實體是建立Post,進入該外掛處理事務
            if (!plugin.EqualEntityName_Action_State(entityName, "create", 40))
                return;
            try
            {
                Entity entity = (Entity)plugin.Context.InputParameters["Target"];
                Entity postEnt = null;
                Entity preEnt = null;
                if (plugin.Context.PostEntityImages.Contains(entityName))
                    postEnt = plugin.Context.PostEntityImages[entityName];
                if (plugin.Context.PreEntityImages.Contains(entityName))
                    preEnt = plugin.Context.PreEntityImages[entityName];

                //處理類容
                //code
                
            }
            catch(Exception ex)
            {
                plugin.MessageShow(ex.Message.ToString());
            }
         
        }
    }
}