Dynamics Plugin 初始化和常用方法
阿新 • • 發佈:2018-11-12
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()); } } } }