0

Я создал прототип современного двигателя MUD. MUD - простая форма моделирования и обеспечивает хороший метод, позволяющий проверить концепцию, над которой я работаю. Это привело меня к нескольким местам в моем коде, где вещи, немного неясны, и дизайн ставится под сомнение (вероятно, из-за его недостатка). Сначала я использую модель (возможно, мне нужно это изменить), и я разработал архитектуру игровых объектов сверху вниз. Возможно, я ошибаюсь.Entity Framework Наследование и логика

Что я сделал, это создать объект MUDObject. Этот объект фактически является базой для всех моих других логических конструкций, таких как символы, их элементы, расы и т. Д. Я также создал набор из трех мета-классов, которые также используются для логических целей, а также атрибуты, события и флаги , Они довольно просты, и все они унаследованы от MUDObject.

Класс MUDObject предназначен для обеспечения поведения данных по умолчанию для всех объектов, включая удаление мертвых объектов. Автоматическая очистка полов. и т. д. Это также предназначено для облегчения этой логики, если это необходимо. Например, проверьте комнату, чтобы проверить, закончился ли эффект и удалив эффект (удалите флаг).

public partial class MUDObject 
{ 
    public virtual void Update() 
    { 
     if (this.LifeTime.Value.CompareTo(DateTime.Now) > 0) 
     { 
      using (var context = new ReduxDataContext()) 
      { 
       context.MUDObjects.DeleteObject(this); 
      } 
     }    
    } 

    public virtual void Pause() 
    { 

    } 

    public virtual void Resume() 
    { 

    } 

    public virtual void Stop() 
    { 

    }   
} 

Я также получил класс World, он является производным от MUDObject и содержит зоны и комнаты (которые, в свою очередь, содержат игры объектов) и обрабатывает таймер для операции для запуска обновления. (Вероятно, будет перемещен, поставить здесь, как будто он работает бы ограничить его только объектами в мире в то время.)

public partial class World 
{ 
    private Timer ticker; 


    public void Start() 
    { 
     this.ticker = new Timer(3000.0); 
     this.ticker.Elapsed += ticker_Elapsed; 
     this.ticker.Start(); 
    } 

    private void ticker_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     this.Update(); 
    } 

    public override void Update() 
    { 
     this.CurrentTime += 3; 
     // update contents 
     base.Update(); 
    } 

    public override void Pause() 
    { 
     this.ticker.Enabled = false; 
     // update contents 
     base.Pause(); 
    } 

    public override void Resume() 
    { 
     this.ticker.Enabled = true; 
     // update contents 
     this.Resume(); 
    } 

    public override void Stop() 
    {    
     this.ticker.Stop(); 
     // update contents 
     base.Stop(); 
    } 
} 

Мне любопытно две вещи.

  1. Есть ли способ перекодировать контекст, так что он имеет отдельные ObjectSets для каждого типа, производного от MUDObject?

    • т.е. context.MUDObjects.Flags или context.Flags
    • Если не так, как я могу запросить у ребенка типа конкретно?
  2. ли Обновлять/Пауза/Возобновление/Стоп архитектуры Я использую работу должным образом при размещении в EF лиц непосредственно? чем для данных только для целей?

    • Будет ли проблема блокировки?
    • Выполняет ли частичный класс автоматически фиксировать изменения, когда они сделаны?
    • Могу ли я лучше использовать плоский репозиторий и делать это прямо в игровом движке?

ответ

2

1) Есть ли способ перекодировать контекст, так что он имеет отдельные ObjectSets для каждого типа, производного от MUDObject?

Да, есть. Если вы решите, что хотите определить базовый класс для всех своих сущностей, обычно существует базовый класс , который не является частью модели фреймворка сущности.Модель содержит только производные тип и контекст содержит DbSet х производные типов (если это DbContext) как

public DbSet<Flag> Flags { get; set; } 

При необходимости вы можете реализовать inheritance между классами, но это было бы выразить полиморфизм, не реализовать общее поведение, связанное с сохранением.

2) Является ли архитектура «Обновление/Пауза/Возобновить/Остановить», я использую правильную работу, когда вы непосредственно помещаете в объекты EF?

№ Объекты не должны знать ничего о настойчивости. Контекст отвечает за их создание, отслеживание их изменений и их обновление/удаление. Я думаю, что это также отвечает на ваш вопрос об автоматической фиксации изменений: нет.

Разработка:

Я думаю, что здесь это хорошо воспитывать единой ответственности принцип. Общая картина будет

  • пусть контекст заселить объекты из магазина
  • пусть объект действовать в соответствии с их обязанностями (моделирование)
  • пусть контекст хранить свои состояния при необходимости

Я думаю, что Pause/Resume/Stop могут быть функциями объектов MUD. Обновление - это совсем другое действие и ответственность.

Теперь я должен спекулировать, но возьмите класс World. Вы должны быть в состоянии выразить свою ответственность в короткой фразе, возможно, что-то вроде «гавани других объектов» или «определить границы». Я не думаю, что он должен делать время. Я думаю, что время должно быть ответственным за некоторую основную полезность, которая сигнализирует о том, что интервал времени истек. Другие объекты знают, как реагировать на это (например, некоторые изменения состояния, или контекст или репозиторий, сохраняют изменения).

Ну, это всего лишь пример , так как подумать об этом, возможно, далек от правильного.

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

+0

Ответственность миров «управлять мета мир» это включает в себя время, силы тяжести, расстояние, а также глобальный состав мира (местоположение районов). Мне нравится концепция единой ответственности. Я вижу, что вы подразумеваете под функцией Update. Я собираюсь интегрировать это непосредственно в логику сервера для сеанса (SuperSocket). Я буду искать пример использования абстрактного класса в качестве основы с моделью. Мне, возможно, придется редактировать текстовые шаблоны, которые могут быть трудными (хотя, возможно, и не для чего-то подобного). Спасибо за вход. –

0

Первое, что нужно сказать, что если вы используете EF 4.1 (как это помечено), вы должны действительно рассмотреть возможность до версии 5.0 (вам нужно будет сделать проект на .NET 4.5 для этого)

с несколькими улучшениями по производительности вы также можете воспользоваться другими функциями. Код я покажу вам, будет работать на 5.0 (я не знаю, если он будет работать на 4.1 версии)

Теперь давайте перейдем к вам несколько вопросов:

Есть ли способ перекодировать контекст так что у него есть отдельные ObjectSets для каждого типа, полученного из MUDObject? Если нет, как я могу задать тип дочернего типа? i.e. context.MUDObjects.Flags или context.Flags

Да, вы можете. Но назвать это немного иначе, у вас не будет Context.Worlds, вы будете иметь базовый класс, который будет называться таким образом, если вы хотите получить набор миров (которые наследуются от MUDObject, вы будете звонить:

var worlds = context.MUDObjects.OfType<World>(); 

Или вы можете сделать в прямой путь с помощью дженериков:.

var worlds = context.Set<World>(); 

Если вы определяете вы наследованию правильный путь, вы должны иметь абстрактный класс MUDObjects и все остальные должны iherit из этого класса EF может отлично справляйтесь с этим, вам просто нужно сделать все правильно.

Является ли архитектура Update/Pause/Resume/Stop я правильно работаю , если вы прямо в объектах EF? чем для данных только для целей?

В этом случае, я думаю, вам следует рассмотреть возможность использования шаблона проектирования под названием Strategy Pattern, провести некоторое исследование, оно будет соответствовать вашим объектам.

Заблокирован ли вопрос?

Зависит от того, как вы разрабатываете систему ....

ли частичный класс автоматически вносить изменения, когда они сделаны ?

Не понимаю, что вопрос .... Частичные классы так же, как обычные классы, Тэй только в разных файлах, но при компиляции (или событие в Design-Time, из-за vshost.exe) они на самом деле только один.

Могу ли я лучше использовать плоский репозиторий и сделать это прямо в игровом движке ?

Трудно ответить, все зависит от требований игры, развертывание стратегии ....

+0

Чтобы решить проблемы с пониманием (моя ошибка). Блокировка, я думаю, теперь поняла, что вы точно соответствуете конкретной реализации. Частичные вопросы класса, ответили в другом сообщении, я спрашивал, автоматически ли сериализуются первые частичные классы EF, используя набор свойств в модели. Мне нравится альтернативный метод обработки подчиненных типов OfType () и Set (): именно так я и искал. Я рассмотрю EF 5.0, возможно, у меня уже есть. У меня есть последний VS2012 Express. Если EF 5.0 стабильный релиз, а что нет? Спасибо за вход. –

+0

Да, EF 5.0 - последняя версия RTM. Я рад, что смогу помочь каким-то образом –

Смежные вопросы