// 默认构造函数
 public MessagePlugin(DBContextBase dbContext)
 {
     this.dbContext = dbContext;
     AssemblyListInit();
 }
        /// <summary>
        /// 处理消息
        /// </summary>
        /// <param name="dbMessage"></param>
        public virtual void Handler(DBContextBase dbContext)
        {
            if (!IsCallHandler())
            {
                return;
            }
            if (!dbMessage.Changed)
            {
                return;
            }

            // 获取服务信息
            string pathAndQuery = apiController.ActionContext.Request.RequestUri.PathAndQuery;
            string moKuaiMc     = pathAndQuery.Split('/')[1];
            string yeWuMc       = pathAndQuery.Split('/')[2];
            string caoZuoMc     = pathAndQuery.Split('/')[3];

            var            controller             = apiController.ActionContext.ControllerContext.Controller;
            var            serviceContextProperty = controller.GetType().BaseType.GetProperty("ServiceContext", System.Reflection.BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            ServiceContext serviceContext         = serviceContextProperty.GetValue(controller) as ServiceContext;

            // 记录当前服务的基本信息
            serviceInfo.Context  = serviceContext;
            serviceInfo.MoKuaiMc = moKuaiMc;
            serviceInfo.YeWuMc   = yeWuMc;
            serviceInfo.CaoZuoMc = caoZuoMc;

            bool async     = false;
            var  asyncList = MediinfoConfig.GetValue("SystemConfig.xml", "AsyncInterfaceServiceList").Split(',');

            foreach (var item in asyncList)
            {
                var list = item.Split('/');
                if (list.Count() != 3)
                {
                    continue;
                }
                var mokuaiming = list[0];
                var yewuming   = list[1];
                var caozuoming = list[2];

                if ((mokuaiming == "*" || mokuaiming.ToUpper() == serviceInfo.MoKuaiMc.ToUpper()) &&
                    (yewuming == "*" || yewuming.ToUpper() == serviceInfo.YeWuMc.ToUpper()) &&
                    (caozuoming == "*" || caozuoming.ToUpper() == serviceInfo.CaoZuoMc.ToUpper())
                    )
                {
                    async = true;
                    break;
                }
            }

            if (async)
            {
                Task.Run(() =>
                {
                    OracleConnectionStringBuilder haloOraConn = new OracleConnectionStringBuilder(MediinfoConfig.GetValue("DbConfig.xml", "HIS6"));
                    OracleConnection haloconn   = new OracleConnection();
                    haloconn.ConnectionString   = haloOraConn.ConnectionString;
                    DBContextBase haloDbContext = new DBContextBase(haloconn, true, haloOraConn.UserID.ToUpper());

                    OracleConnectionStringBuilder pgOraConn = new OracleConnectionStringBuilder(PluginDBConfig);
                    OracleConnection pgconn   = new OracleConnection();
                    pgconn.ConnectionString   = pgOraConn.ConnectionString;
                    DBContextBase pgDbContext = new DBContextBase(pgconn, true, pgOraConn.UserID.ToUpper());

                    var haloTrans = haloDbContext.Database.BeginTransaction();
                    var pgTrans   = pgDbContext.Database.BeginTransaction();

                    try
                    {
                        var pluginDll = Mediinfo.Enterprise.Config.MediinfoConfig.GetValue("SystemConfig.xml", "MessagePlugin");
                        var assembly  = Assembly.Load(pluginDll);

                        var types = assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IDbMessageHandler))).ToArray();

                        var impls = types.Where(t => !t.IsInterface).ToList();

                        foreach (var impl in impls)
                        {
                            var implInstance = (IDbMessageHandler)assembly.CreateInstance(impl.FullName);
                            implInstance.Handler(haloDbContext, pgDbContext, serviceInfo, dbMessage);
                        }

                        haloTrans.Commit();
                        pgTrans.Commit();
                    }
                    catch (Exception ex)
                    {
                        haloTrans.Rollback();
                        pgTrans.Rollback();
                        throw ex;
                    }
                    finally
                    {
                        haloDbContext.Dispose();
                        pgDbContext.Dispose();
                        dbMessage = new DbMessage.DbMessage();
                    }
                });
            }
            else
            {
                OracleConnectionStringBuilder pgOraConn = new OracleConnectionStringBuilder(PluginDBConfig);
                OracleConnection pgconn = new OracleConnection();
                pgconn.ConnectionString = pgOraConn.ConnectionString;
                DBContextBase pgDbContext = new DBContextBase(pgconn, true, pgOraConn.UserID.ToUpper());

                var pgTrans = pgDbContext.Database.BeginTransaction();

                try
                {
                    var pluginDll = Mediinfo.Enterprise.Config.MediinfoConfig.GetValue("SystemConfig.xml", "MessagePlugin");
                    var assembly  = Assembly.Load(pluginDll);
                    var types     = assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IDbMessageHandler))).ToArray();

                    var impls = types.Where(t => !t.IsInterface).ToList();

                    foreach (var impl in impls)
                    {
                        var implInstance = (IDbMessageHandler)assembly.CreateInstance(impl.FullName);
                        implInstance.Handler(dbContext, pgDbContext, serviceInfo, dbMessage);
                    }

                    pgTrans.Commit();
                }
                catch (Exception ex)
                {
                    pgTrans.Rollback();
                    throw ex;
                }
                finally
                {
                    pgDbContext.Dispose();
                    dbMessage = new DbMessage.DbMessage();
                }
            }
        }