Пользовательский конструктор DSL - вызывается только при создании, а не при загрузке
-
12-09-2019 - |
Вопрос
Информация: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();
}
}
}
Решение
Похоже, что вы инициализируете некоторые свойства класса домена из конструктора.Лучше всего это сделать, создав addRule.Дополнительные правила вызываются, когда в модель добавляется экземпляр доменного класса, к которому они присоединены.Например :
[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 VS 2008.ИММВ.
Другие советы
Хотя это неправильный подход (ответ Пола Лалонда - лучший), вот как вы можете узнать в любой момент времени, сериализуется ли модель (= загрузка):
this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing