DSL Custom Constructor - только вызов, когда создан, не загружается - PullRequest
0 голосов
/ 22 сентября 2009

Информация: VS2010, DSL Toolkit, C #

У меня есть собственный конструктор в одном из классов моего домена, который добавляет некоторые дочерние элементы. У меня есть проблема, так как я хочу, чтобы она запускалась только при создании элемента класса домена, а не каждый раз, когда открывается диаграмма (которая вызывает конструкторы)

        public Entity(Partition partition, params PropertyAssignment[] propertyAssignments)
        : base(partition, propertyAssignments)
    {
        if (SOMETHING_TO_STOP_IT_RUNNING_EACH_TIME)
        {
            using (Transaction tx = Store.TransactionManager.BeginTransaction("Add Property"))
            {
                Property property = new Property(partition);
                property.Name = "Class";
                property.Type = "System.String";
                this.Properties.Add(property);
                this.Version = "1.0.0.0"; // TODO: Implement Correctly
                tx.Commit();
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 23 сентября 2009

Похоже, вы инициализируете некоторые свойства класса домена из конструктора. Это лучше всего сделать, создав AddRule. AddRules вызываются, когда в модель добавляется экземпляр класса домена, к которому они присоединены. Например:

[RuleOn(typeof(Entity), FireTime = TimeToFire.TopLevelCommit)]
internal sealed partial class EntityAddRule : AddRule
{
  public override void ElementAdded(ElementAddedEventArgs e)
  {
    if (e.ModelElement.Store.InUndoRedoOrRollback)
      return;

    if (e.ModelElement.Store.TransactionManager.CurrentTransaction.IsSerializing)
      return;

    var entity = e.ModelElement as Entity;

    if (entity == null)
      return;

    // InitializeProperties contains the code that used to be in the constructor
    entity.InitializeProperties();
  }
}

Затем необходимо зарегистрировать AddRule, переопределив функцию в классе модели вашего домена:

public partial class XXXDomainModel
{
  protected override Type[] GetCustomDomainModelTypes()
  {
    return new Type[] {
      typeof(EntityAddRule),
    }
  }
}

Дополнительные сведения о правилах см. В разделе «Как создать пользовательские правила» в документации VS SDK.

Примечание: решение основано на DSL Tools VS 2008. YMMV.

0 голосов
/ 07 октября 2009

Хотя не правильный подход (ответ Пола Лалонда - лучший), вот как вы можете в любой момент узнать, сериализована ли модель (= загрузка):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
...