Esempio n. 1
0
        /// <summary>
        /// Получить бизнессерве
        /// </summary>
        /// <param name="dataObjectType">для объекта типа</param>
        /// <param name="dsevent">событие</param>
        /// <returns></returns>
        static public BusinessServer[] GetBusinessServer(System.Type dataObjectType, DataServiceObjectEvents dsevent, IDataService ds)
        {
            //2011-08-04 Братчиков: кешируем с учётом разных строк соединения. Это нужно для того чтобы не переписывать чужому бизнес-серверу датасервис
            string key = dataObjectType.FullName + "." + dsevent + "." + (ds != null? (ds.CustomizationString ?? "salt"):"tlas").GetHashCode();

            lock (cache)
            {
                if (cache.ContainsKey(key))
                {
                    BusinessServer[] ret_bs = (BusinessServer[])cache[key];

                    foreach (BusinessServer bsi in ret_bs)
                    {
                        bsi.DataService = ds;
                    }

                    return(ret_bs);
                }
                ArrayList bss      = new ArrayList();
                bool      needSort = false;
                while (dataObjectType != typeof(DataObject) && dataObjectType != typeof(object))
                { // TODO: разобраться с логикой выполнения и привести в соответствие со статьёй http://storm:3013/Otrabotka-polzovatelskih-operacii-v-processe-raboty-servisa-dannyh-integraciya-s-biznes-serverom.ashx.
                    //получим сначала бизнес-сервера у самого класса (не может быть больше одного)
                    ArrayList atrs = new ArrayList(dataObjectType.GetCustomAttributes(typeof(BusinessServerAttribute), false));

                    //добавим бизнес-сервера, которые достались от интерфейсов
                    Type[]      interfaces     = dataObjectType.GetInterfaces();
                    List <Type> baseInterfaces = new List <Type>();
                    if (dataObjectType.BaseType != null)
                    {
                        baseInterfaces.AddRange(dataObjectType.BaseType.GetInterfaces());
                    }
                    foreach (Type interf in interfaces)
                    {
                        if (!baseInterfaces.Contains(interf))
                        {
                            atrs.AddRange(interf.GetCustomAttributes(typeof(BusinessServerAttribute), false));
                        }
                    }
                    //создадим инстанции бизнес-серверов и добавим в итоговый массив
                    foreach (BusinessServerAttribute atr in atrs)
                    {
                        if ((dsevent & atr.ServerEvents) == dsevent)
                        {
                            BusinessServer bs = (BusinessServer)Activator.CreateInstance(atr.BusinessServerType);
                            bs.DataService = ds;
                            bs.SetType(dataObjectType);
                            bss.Insert(0, bs);
                            if (atr.Order != 0)
                            {
                                bs.Order = atr.Order;
                                needSort = true;
                            }
                        }
                    }

                    dataObjectType = dataObjectType.BaseType;
                }
                //пересортируем бизнессерверы
                if (needSort)
                {
                    //Получим отсортированный список, в котором будет упорядоченная коллекция с допустимыми одинаковыми ключами
                    //bss.Sort(new BusinesServerComparer());
                    ArrayList  sortedArList = new ArrayList();
                    SortedList sl           = new SortedList();
                    foreach (BusinessServer bs in bss)
                    {
                        if (!sl.ContainsKey(bs.Order))
                        {
                            sl.Add(bs.Order, new ArrayList());
                        }
                        ((ArrayList)sl[bs.Order]).Add(bs);
                    }

                    foreach (DictionaryEntry entry in sl)
                    {
                        ArrayList arl = (ArrayList)entry.Value;
                        sortedArList.AddRange(arl);
                    }
                    bss = sortedArList;
                }
                BusinessServer[] res = (BusinessServer[])bss.ToArray(typeof(BusinessServer));
                cache.Add(key, res);
                return(res);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Бизнессервер
 /// </summary>
 /// <param name="businessServerType">Тип бизнессервера</param>
 /// <param name="serverEvents">События</param>
 /// <param name="order">Упорядочение бизнес-серверов. 0 - выполнится раньше остальных, int.MaxValue - выполнится последним</param>
 public BusinessServerAttribute(System.Type businessServerType, DataServiceObjectEvents serverEvents, int order) :
     this(businessServerType)
 {
     ServerEvents = serverEvents;
     Order        = order;
 }
Esempio n. 3
0
 /// <summary>
 /// Бизнессервер
 /// </summary>
 /// <param name="businessServerType">Тип бизнессервера</param>
 /// <param name="serverEvents">События</param>
 /// <param name="order">Упорядочение бизнес-серверов. 0 - выполнится раньше остальных, int.MaxValue - выполнится последним</param>
 public BusinessServerAttribute(string businessServerType, DataServiceObjectEvents serverEvents, int order) :
     this(Type.GetType(businessServerType, true, true), serverEvents, order)
 {
 }
Esempio n. 4
0
 /// <summary>
 /// Бизнессервер
 /// </summary>
 /// <param name="businessServerType">Тип бизнессервера</param>
 /// <param name="serverEvents">События</param>
 public BusinessServerAttribute(System.Type businessServerType, DataServiceObjectEvents serverEvents) :
     this(businessServerType)
 {
     ServerEvents = serverEvents;
 }