using Bro.Common.Base; using Newtonsoft.Json; using PostSharp.Aspects; using System; namespace Bro.Common.Helper { public static class JsonHelper { public static JsonSerializerSettings JsonSetWithType = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; } #region PostSharp AOP related /// /// 工序设备运行切面 用于修饰DeviceBase的SetAndRun /// [Serializable] public sealed class DeviceRunAspect : DeviceExceptionAspect { /// /// 设备操作前 /// /// public override void OnEntry(MethodExecutionArgs args) { #region 检查设备状态 DeviceBase device = args.Instance as DeviceBase; if (device.CurrentState != EnumHelper.DeviceState.DSOpen) { throw new ProcessException($"{device.Name}不在开启状态,无法操作!"); } #endregion #region 启用日志 device.LogAsync(DateTime.Now, $"{device.Name}开始{args.Method.Name}", ""); #endregion } /// /// 设备完成操作后 /// /// public override void OnSuccess(MethodExecutionArgs args) { DeviceBase device = args.Instance as DeviceBase; #region 完成日志 device.LogAsync(DateTime.Now, $"{device.Name}完成{args.Method.Name}", ""); #endregion } } [Serializable] public class DeviceExceptionAspect : OnMethodBoundaryAspect { public override void OnException(MethodExecutionArgs args) { DeviceBase device = args.Instance as DeviceBase; if (device.CurrentState != EnumHelper.DeviceState.DSExcept) { device.CurrentState = EnumHelper.DeviceState.DSExcept; device.CurrentStateToBe = EnumHelper.DeviceState.DSExcept; Exception ex = args.Exception; #region 通知设备的状态变动 device.OnExceptionOccured?.Invoke(DateTime.Now, ex); #endregion #region 异常日志记录 device.LogAsync(DateTime.Now, $"{device.Name}异常信息", ex.GetExceptionMessage()); #endregion } args.FlowBehavior = FlowBehavior.ThrowException; } } [Serializable] public class ProcessExceptionAspect : OnExceptionAspect { public override void OnException(MethodExecutionArgs args) { Exception ex = args.Exception; //if (!(ex is ProcessException)) //{ // new ProcessException(ex); //} args.FlowBehavior = FlowBehavior.Return; } } #endregion }