Exemple #1
0
 public override АМОбъект Восстановить(BinaryReader читатель)
 {
     СобственныйАдресПримитива = new Адрес();
     СобственныйАдресПримитива = (Адрес)СобственныйАдресПримитива.Восстановить(читатель);
     НомерБайтаВФайле          = читатель.ReadInt32();
     return(this);
 }
Exemple #2
0
        //сообщения от объектов обратной связи
        //объект обратной связи разрывает связь
        public void УдалитьСвязьИзСпискаОбратныхСвязей(Адрес удаляемыйАдрес)
        {
            ; // найти связь в СпискеОбратныхСвязей
            var удаляемаясвязь = СписокОбратныхСвязей.Find(связь => связь.АдресОбъекта == удаляемыйАдрес);

            СписокОбратныхСвязей.Remove(удаляемаясвязь);
        }
Exemple #3
0
        public static void ДобавитьПоле(Адрес адресКласса, ГруппаОбъектов поле)
        {
            var класс = (ГруппаОбъектов)адресКласса.АдресВКуче();

            // проверить что класс это класс
            // что поле это поле
            ((ГруппаОбъектов)класс[2]).Добавить(поле);
        }
Exemple #4
0
        public АктивностьСложение(Адрес адресСлогаемого1, Адрес адресСлогаемого2) : base()
        {
            var Связь = ДайСвязьПоИмени("Слогаемое1");

            Связь.АдресУдаленнойСвязи = адресСлогаемого1; //т.к. сервер надо установить Соственныйадрес
            var связь2 = ДайСвязьПоИмени("Слогаемое2");

            связь2.АдресУдаленнойСвязи = адресСлогаемого2;
        }
Exemple #5
0
 public void СообщитьПодписчикамОбИзмененииСобственногоАдреса(Адрес новыйАдрес)
 {
     foreach (var связь in СписокОбратныхСвязей)
     {
         dynamic объектОбратнойСвязи = связь.АдресОбъекта.АдресВКуче();
         объектОбратнойСвязи.ИзменитьАдресПрямойСвязи(СобственныйАдрес, новыйАдрес);
     }
     // в случае успеха
     СобственныйАдрес = новыйАдрес;
 }
Exemple #6
0
        public override АМОбъект Восстановить(BinaryReader читатель)
        {
            АдресРегистратора = (Адрес)АМОбъект.Создать(читатель.BaseStream);

            // востановление происходит в другом адресном пространстве
            // если это адрес из другого адресногопространства тто его можно не менятть
            // если локальное, то нужно добавить адрес удаленной машины

            return(this);
        }
Exemple #7
0
        public АдресУРегистратора ПолучиАдресУРегистратора(Адрес адресРегистратора) // запускается только при создании новой связи перенести в сам регистратор
        {
            var регистратор = ( егистраторАдресов)адресРегистратора.АдресВКуче();

            Пароль           = Guid.NewGuid();
            АдресСобственный = регистратор.ЗарегистрируйНаСвободныйАдрес(this, Пароль);
            return(СвойАдресУРегистратора);

            //СловарьСобственныхАдресовУРегистраторов[регистратор] = адрес; // плодить адреса у связи не стоит, многосвязей может быть у активности
            //СписокСобственныхАдресов.Add(адрес); // можно просмотреть все адреса и сравнить регистраторв
        }
Exemple #8
0
        public bool Заменить(Адрес адрес, ПримитивИлиАдрес новоеЗначение)
        {
            var адр = адрес as АдресВГруппе;

            if (адр == null)
            {
                return(false);
            }

            Список[адр.НомерВГруппе] = новоеЗначение;
            return(true);
        }
Exemple #9
0
        public ПроксиОбъекта ДайЭлемент(int индекс, Адрес адресВладельца)    // дается копия элемента
        {
            var элемент = new ПроксиОбъекта();

            элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать();
            //элемент.Примитив = Список[индекс].Копировать();

            СписокВладельцевЭлементов[индекс].Add(адресВладельца);
            //Подписать на изменеия значения, адреса, значения примитива

            return(элемент);
        }
Exemple #10
0
        public ПроксиОбъекта ДайЭлемент(Адрес адрес, Адрес адресВладельца) // дается копия элемента
        {
            var индекс  = ((АдресВГруппе)адрес).НомерВГруппе;
            var элемент = new ПроксиОбъекта();

            элемент.АдресПримитива = (Адрес)Список[индекс].СобственныйАдресПримитива.Копировать();
            //элемент.Примитив = Список[индекс].Копировать();

            СписокВладельцевЭлементов[индекс].Add(элемент.СобственныйАдресПримитива);
            //собственный адрес элемента еще не определен, указывается адрес в Куче адреса
            //Подписать на изменеия значения, адреса, значения примитива

            return(элемент);
        }
Exemple #11
0
        public АМОбъект СоздатьКопиюОбъект(Адрес адрес)   //читает только первый уровень, не лезет разбирать адреса
        {
            var фАдрес = адрес as АдресВФайле;

            if (фАдрес == null)
            {
                return(Пустота.Статик);
            }

            Читатель.BaseStream.Position = фАдрес.НомерБайтаВФайле; //перместить указатель на адрес объекта
            var прим = АМОбъект.Создать(Читатель.BaseStream);

            return(прим);
        }
Exemple #12
0
        //сообщения от объектов прямой связи
        // Адрес Объекта прямой связи изменился, необходимо внести изменения в существующую связь
        //объект переехал
        public void ИзменитьАдресПрямойСвязи(Адрес старыйАдрес, Адрес новыйАдрес)
        {
            var стараяСвязь = ПрямыеСвязи.Find(связь => связь.АдресОбъекта == старыйАдрес);

            if (стараяСвязь != null)
            {
                стараяСвязь.АдресОбъекта = новыйАдрес;
            }
            else //ошибка - несущесствующаясвязь
            {
                //передатьсообщение объекту по старому адресу  удалить обратную связь
                dynamic объектПоСтаромуАдресу = старыйАдрес.АдресВКуче();
                объектПоСтаромуАдресу.УдалитьСвязьИзСпискаОбратныхСвязей(СобственныйАдрес);
            }
        }
Exemple #13
0
        public ПроксиОбъекта ДайЭлементСловаря(Адрес адрес)
        {
            var элемент = ДайЭлемент(адрес, СобственныйАдресПримитива);

            // везде добавляется собственный адрес группы
            // в списке владельцев будет куча одного и тогоже адреса группы - исправить
            // группа должна содержать реакцию на изменние словаря, нужно найти элементы адресом больше или равно изменяемого адреса и поменять их на единицу больше или меньше
            // если связь со словарем разорвана, то измения могут потеряться
            // врианты иметь локальную копию словаря и каждый раз сравнивать версию
            // редактирование словаря приводит к созданию новой копии и таблицы изменения
            // изменения: удален элемент с номером, изменен адрес того же алемента, новый элемент
            // если эменты сложные например группа и поменялась группа, замена

            return(элемент);
        }
Exemple #14
0
        public static ГруппаОбъектов СоздатьПоле(string имя, Адрес адресТипаПоля) //адрес типа поля
        {
            // это описание поля
            var поле = new ГруппаОбъектов
            {
                [0] = new Строка("поле"),
                [1] = new Строка(имя),
                [2] = адресТипаПоля,
                [3] = new Строка("Значение")// это значение нужно только для объекта с полным самоописанием, значение поля экземпляра содержиться в экземпляре
            };

            // лучше указать адрес (адрес справочника, номер строки)
            // поле "принадлежит" типу или экзепляру

            return(поле);
        }
Exemple #15
0
        public АМОбъект this[Адрес адрес]
        {
            get
            {
                var индекс     = ((АдресВГруппе)адрес).НомерВГруппе;
                var адресВКуче = АдресаОбъектовВКуче[индекс] as АдресВГруппе;

                return(АдресКучи[адресВКуче]);
            }
            set
            {
                var индекс     = ((АдресВГруппе)адрес).НомерВГруппе;
                var адресВКуче = АдресаОбъектовВКуче[индекс] as АдресВГруппе;
                АдресКучи[адресВКуче] = value;
            }
        }
Exemple #16
0
        public override АМОбъект this[Адрес адрес]
        {
            get
            {
                switch (адрес)
                {
                case АдресИндексаВФайле а:
                    return(ДайОбъектПоИндексу(а.НомерИндексаВФайле));

                case АдресВФайле а:
                    return(СоздатьКопиюОбъект(а));
                }

                return(Пустота.Статик);
            }
            set { base[адрес] = value; }
        }
Exemple #17
0
        public ЦелоеЧисло Сложи(Адрес АдресСлогаемого1, Адрес АдресСлогаемого2)  // услуга -- нет смысла хранить ни слогаемые ни сумму есть проблема с параллельным выполнением надо делать временные связи
        {
            var связь = new Связь()
            {
                АдресУдаленнойСвязи = АдресСлогаемого1
            };
            var слог1 = (ЦелоеЧисло)связь.ПередайКоманду(new Команда("ДайЗначение"));

            связь.АдресУдаленнойСвязи = АдресСлогаемого2;
            var слог2 = (ЦелоеЧисло)связь.ПередайКоманду(new Команда("ДайЗначение"));

            return(new ЦелоеЧисло(слог1.Значение + слог2.Значение));

            ДайСвязьПоНомеру(0).АдресУдаленнойСвязи = АдресСлогаемого1;
            ДайСвязьПоНомеру(1).АдресУдаленнойСвязи = АдресСлогаемого2;
            return(new ЦелоеЧисло(Слогаемое(0).Значение + Слогаемое(1).Значение));
        }
Exemple #18
0
        // собственный адрес для обратного вызова присваивается новым владельцем и сообщается источнику хранения
        public override ПримитивИлиАдрес Восстановить(Stream поток)                                 // где восстановить
        {
            var адресГдеВостановить = СобственныйАдресПримитива.СоздатьСвязь().АдресУдаленнойСвязи; // пусть эта связь доступна Как параметр
            var адресУдаленный      = (АдресУниверсальный)Создать(поток);                           // это адрес локальный АдресВХрналище, например

            var текущийадрес = new АдресУниверсальный();

            текущийадрес.АдресРегистратора         = адресГдеВостановить;
            текущийадрес.СобственныйАдресПримитива = адресГдеВостановить;
            текущийадрес.КомандаОбъекту            = new Команда("ДайЭлемент", адресУдаленный);
            АдресПримитива = текущийадрес;

            // это код для Активности или
            var канал = АдресПримитива.ТипКанала();

            var группа = АдресПримитива.АдресРегистратора;// это адрес группы

            return(base.Восстановить(поток));
        }
Exemple #19
0
        //
        public static void СоздайОдностороннююСвязьВПамяти(Адрес АдресИсходящаяАктивность, Адрес адресВходящаяАктивность)
        {
            var исходящаяАктивность = (Активность)АдресИсходящаяАктивность.АдресВКуче();
            var входящаяАктивность  = (Активность)адресВходящаяАктивность.АдресВКуче();

            // в исходящей создается клиент
            var связьВисходящей = new Связь()
            {
                ТипСвязи = "исходящая", ИмяСвязи = "передатчик",
            };
            var адресВИсходящей = исходящаяАктивность.ДобавьСвязь(связьВисходящей);  // это относительныйАдрес связи относительно активности

            // созлается сервер
            var связьВоВходящей = new Связь()
            {
                ИмяСвязи = "приемник", ТипСвязи = "входящая", АдресУдаленнойСвязи = адресВИсходящей
            };
            var адресВоВходящей = входящаяАктивность.ДобавьСвязь(связьВоВходящей);

            связьВисходящей.АдресУдаленнойСвязи = адресВоВходящей;
        }
Exemple #20
0
        // СписокВходящих = null

        public bool Подписаться(Адрес адресПодписчика) // добавить в список связей новую связь с типом связи (роль= подписчик, тип =исходящий, инициатива- активная или пассивная
                                                       // , связь создается в зависимости от адреса, роли, типа )
        {
            return(true);
        }
Exemple #21
0
 public virtual ПроксиОбъекта this[Адрес адрес]
 {
     get { return(null); }
     set { }
 }
Exemple #22
0
 public virtual АМОбъект this[Адрес адрес]
 {
     get { return(null); }
     set { }
 }
Exemple #23
0
 public override ПроксиОбъекта this[Адрес адрес]
 {
     get { return(base[адрес]); }
     set { base[адрес] = value; }
 }
Exemple #24
0
        public void СоздатьКопиюОбъектВПрострастве(Адрес адрес, ГруппаОбъектов Память) //временное сохранение в памяти объекта
        {
            var объект = СоздатьКопиюОбъект(адрес);

            Память.Добавить(объект); // можно сохранить еще в хранилище это сохраняемый объект, а не временный, Память нужно в конце очищать или заводить отдельную группу с путым сохранением
        }