Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
20 / 20 / 12
Регистрация: 15.05.2012
Сообщений: 168
1

Разработка триггера

18.06.2018, 21:58. Просмотров 495. Ответов 2
Метки нет (Все метки)

Доброго вечера, форумчане.
Разрабатываю свою маленькую софтинку и столкнулся с небольшим казусом, а точнее хочу идеала, но чувствую, что не могу к нему придти.
Суть такова, моя программа является промежуточным звеном между сервером и клиентом и как прокси-сервер пропускает через себя пакеты. Я захотел создать некую возможность создавать триггеры - то есть отвечать на сервер/клиент если данные из пакета будут соответствовать заданным условиям.
Все сделал, все работает, но чувствую, что сделал не по всем законам ООП. Так же основная задача пополнять вручную эти триггеры и ответы на них. То есть чтобы через визуальный конструктор можно было создать триггер, в него добавить условие срабатывания и действия, которые будут выполняться.
Чтобы внести чуть наглядности - немного кода:

Базовый класс триггеров
Содержит условие и список действий. Первый минус, что условие одно, а не несколько.
В коде понятно, что Execute вызывает лист задач, а Match проверяет условие из наследуемых классов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  public abstract class BaseTriggerModel<T> where T : Packet
    {
        public ConditionTriggerModel<T> ConditionTrigger { get; set; }
        public ObservableCollection<IActionTriggerModel> Actions { get; set; }
        protected virtual void Initialize(T conditionValue)
        {
            Actions = new ObservableCollection<IActionTriggerModel>();
            ConditionTrigger = new ConditionTriggerModel<T>(conditionValue);
        }
 
        public async void Execute()
        {
            foreach (var action in Actions)
            {
               await action.Execute();
            }
        }
        public abstract bool Match(T conditionPacket);  
    }
Класс условия
По сути это просто хранилище данных пакета с которым сравниваются входящие данные, что ни есть хорошо посколько ограничивается список возможных условий.
C#
1
2
3
4
5
6
7
8
 public class ConditionTriggerModel<T> where T: Packet
    {
        public T Value { get; set; }
        public ConditionTriggerModel(T value)
        {
            Value = value;
        }         
    }
Интерфейс действия
Банальный интерфейс, содержащий Action (действие), которое будет вызываться, саму процедуру вызова и динамично изменяющиеся данные, которые возможно нужно поправить в Action пере вызовом (динамичность - это тоже плохо)
C#
1
2
3
4
5
6
public interface IActionTriggerModel
    {
        Action TriggerAction { get; set; }
        void HandleData(dynamic data);
        Task Execute();
    }
Класс ответа триггера
Во первых проблема в обобщении, прямое обобщение типа BaseTriggerModel<ObjectMove> не позволит добавлять этот триггер в список List<BaseTriggerModel<Packet>>, хоть тип Packet и является базовым от ObjectMove. (Кто знаком с обобщениями поймут). Поэтому приходится приводить к типу напрямую, что как по мне тоже моветон.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 public class CounterSkillTriggerModel<T>: BaseTriggerModel<Packet> where T: ObjectMove
    {     
       public CounterSkillTriggerModel(Point coords)
       {
           base.Initialize(new ObjectMove{Coords = coords});   
       }  
 
       public override bool Match(Packet gPacket)
       {
           if (!(gPacket is T packet) || !(ConditionTrigger.Value is T condition))
               return false;
           
           return condition.Coords.Equals(gPacket.Coords);
        }
   }
После этого происходит простое добавление в список триггеров, которые непосредственно проверяются при обработке пакетов, полностью десериализуя их и подставляя уже готовые экземпляры в нужные классы, которые описал выше.

Согласно вышеизложенного хотел бы критики и советов как правильнее было бы провести реализацию, где главная заточка идет на то, что можно устанавливать разные взаимосвязи между определенными условиями и списком действий. Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2018, 21:58
Ответы с готовыми решениями:

Создание триггера
На моей формочке есть несколько комбобоксов и текстбоксов, к которые я вношу информацию, затем...

Работа триггера
Привет всем. Есть триггер который при удалении записи из главной таблицы сперва удаляет все...

Обработка срабатывания триггера
Так, а кто сталкивался с выводом системного сообщения пользователю в клиентском приложении о...

добавление триггера к существующему шаблону
привет форумчане. собственно такая штука: у меня в программе при инициализации кастомного...

2
248 / 161 / 68
Регистрация: 10.12.2017
Сообщений: 558
19.06.2018, 14:30 2
Привет.

GetType пробовал? - https://stackoverflow.com/ques... th-gettype
Или dynamic...
0
Модератор
Эксперт .NET
5300 / 4095 / 1182
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
19.06.2018, 16:12 3
skew, посмотрите в сторону этого шаблона. Исходя из вашего описания, он может помочь в вашей задаче.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2018, 16:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вывод сообщения из триггера в программе
Есть тригер create trigger onCl1 on for insert,Update as Begin transaction If exists...

Реализация триггера в системе продаж
Не знаю, как правильно написать тригер. Кто нибудь может объяснить алгоритм действий? Как более...

Биндинг триггера к свойству формы
Такой код: &lt;Button Content=&quot;Connect&quot; Grid.Row=&quot;1&quot; Grid.Column=&quot;9&quot;...

Ошибка триггера обработчика событий
Добрый день! Есть такая разметка &lt;TabControl ItemsSource=&quot;{Binding Collect}&quot; ...

Firebird программно определить наличие генератора и триггера
Доброго времени суток. Есть старая БД на Firebird 2.5. При очередном обновлении хочу добавить в...

Создание триггера в представлении MS SQL Server 2014
Как повесить триггер на представление? По инструкции с MSDN не получается, кнопка &quot;Создать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.