sfreaky
@sfreaky
Начинающий веб и софт разработчик

Как получить синглтон в пределах одного класса, а не всего приложения?

Разрабатываю игру наподобие HearthStone. Есть состояние стола
public class Table
    {
        public Table()
        {
            Players = new List<PlayerModel>();
        }
        public List<PlayerModel> Players { get; set; }
        public int Queue { get; set; }
    }

И есть некий диспетчер триггеров, который оповещает о том, что в игре произошло какое-либо событие (карта атакована, сыграно заклинание и т.д)
public class TriggerDispatcher
    {
        public TriggerDispatcher()
        {
            if (Triggers == null)
                Triggers = new Dictionary<string, ITrigger>();
        }
        public ITrigger GetTrigger<T>() where T : ITrigger
        {
            if (Triggers.ContainsKey(typeof(T).Name))
                return Triggers[typeof(T).Name];
            var trigger = Activator.CreateInstance<T>();
            Triggers.Add(typeof(T).Name, trigger);
            return trigger;
        }
        public Dictionary<string, ITrigger> Triggers { get; }
    }
    public interface ITrigger
    {
        void AddAction(IAction action);
        void RemoveAction(IAction action);
        void ExecuteActions(object param);
    }

Нужно, чтобы эти два класса были доступны из любого места в пределах одной сессии. На сервере создаются сессии состоящие из двух игроков и для них создаются экземпляры стола и диспетчера. Как организовать их получение в других местах кода в пределах сессии?
  • Вопрос задан
  • 237 просмотров
Решения вопроса 1
Если правильно - подключить DI Container, делать все через него.

Если без контейнера - передавать зависимости вручную. Обычно они не нужны везде

То, о чем вы рассказываете лично я делал несколько иначе. Событий, как таковых, нету. Есть команда, которая и есть событием. Например AttackCommand, MoveCommand, DeployCommand. Все взаимодействие идет через команды, все остальные классы - сухие данные. Соответственно всякие такие вещи нужны только командам, а они создаются через единый центр, который и делает инъекцию.

Тут я писал статью:
https://habrahabr.ru/post/322258/
https://habrahabr.ru/post/322268/

А еще, если напишете на емейл (есть в профиле), могу скинуть пример сервера ККИ на C#.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks Куратор тега C#
А Session.TriggerDispatcher и Session.Table чем-то не устраивают?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы