2009-09-22 4 views
0

Информация: VS2010, DSL Toolkit, C#DSL Пользовательского Конструктора - только вызывая при создании не загружая

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

 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

Похоже, вы инициализируете некоторые свойства класса домена из внутри конструктора. Это лучше всего сделать, создав 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.

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

+0

Спасибо Пол для вашего ответа. Я собираюсь пройти тестирование уже сейчас! –

+0

Он работает, очень ценится. В DSL есть чему поучиться, но я считаю, что это определенно стоит усилий. –

+0

Как вопрос с половиной стороны. Если бы я хотел сделать что-то симулятивное для создания диаграммы (Project> Add Item), должен ли я использовать конструктор, или я должен использовать тот же шаблон, что и здесь? благодаря –

0

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

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