/// <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); } }
/// <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; }
/// <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) { }
/// <summary> /// Бизнессервер /// </summary> /// <param name="businessServerType">Тип бизнессервера</param> /// <param name="serverEvents">События</param> public BusinessServerAttribute(System.Type businessServerType, DataServiceObjectEvents serverEvents) : this(businessServerType) { ServerEvents = serverEvents; }