سؤال

INFO: 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),
    }
  }
}

لمزيد من المعلومات حول القواعد، إلقاء نظرة على موضوع "كيفية: إنشاء قواعد مخصصة" في وثائق SDK VS.

ملاحظة: يستند الحل إلى أدوات DSL مقابل 2008. ymmv.

نصائح أخرى

على الرغم من أن النهج الصحيح (Paul Lalonde Answer هو الأفضل)، إليك وكيفية معرفة ذلك، في أي وقت معين، إذا كان النموذج يجري تسلسل (= التحميل):

this.Store.TransactionManager.CurrentTransaction!= null &&
this.Store.TransactionManager.CurrentTransaction.IsSerializing
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top