كيفية القيام بما يلي: ربط تحديثات طراز باستخدام العمليات
عندما تقوم بتعريف ملحق لمصممي UML في Visual Studio Ultimate ، يمكنك تجميع العديد من التغييرات في عملية واحدة تسمى سياق تراجع مرتبط .
افتراضياً، كل تعديل تصنعه التعليمات البرمجية في طراز يمكن أن يتم التراجع عنها بشكل منفصل بواسطة المستخدم. على سبيل المثال، إذا قمت بتعريف أمر قائمة يقوم بتبديل أسماء فئتيّ UML , يمكن للمستخدم استدعاء الأمر ثم يقوم بتنفيذ تراجع واحد. هذا سوف يتراجع عن التغيير في اسم واحد, وليس الآخر، و يترك الطراز الخاص بك في حالة غير مرغوب بها.
لتجنب هذا, التعليمات البرمجية يمكنها تنفيذ سلسلة من التغييرات داخل عملية. يجعل ذلك التغييرات تبدو مثل تغيير واحد بالنسبة للمستخدم. أمر التراجع اللاحق سيقوم بالتراجع عن السلسلة بأكملها.
توجد فائدة إضافية في أن التعليمات البرمجية الخاصة بك يمكنها التراجع عن مجموعة كاملة جزئياً من التغييرات عن طريق طرح استثناء أو عن طريق إحباط العملية.
لتجميع تغييرات في عملية واحدة
تأكد من أن مراجع المشروع الخاص بك تتضمن تجميع .NET هذا:
Microsoft.VisualStudio.Modeling.Sdk.10.0.dll
داخل الفئة الخاص بك, قم بتعريف خاصية مستوردة لها النوع ILinkedUndoContext:
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
...
class … {
[Import]
public ILinkedUndoContext LinkedUndoContext { get; set; }
في أسلوب يقوم بتعديل الطراز, قم بتضمين التغييرات الخاصة بك في عملية:
using (ILinkedUndoTransaction transaction =
LinkedUndoContext.BeginTransaction("my updates"))
{
// code to update model elements or shapes goes here
transaction.Commit();
}
لاحظ ما يلي:
يجب أن تقوم دائماً بتضمين Commit() في نهاية العملية. إذا تم التخلص من عملية دون أن يتم تنفيذها, سيتم العودة للحالة السابقة للعملية. أي، استعادة الطراز سيعود إلى حالته في بداية العملية.
في حالة حدوث استثناء لم يتم تصنيفه داخل العملية, سوف يتم التراجع عن العملية. إنه نقش متكرر أن يتم وضع كتلة using للعملية داخل كتلة try…catch .
يمكنك تداخل العمليات.
يمكنك توفير أي اسم غير فارغ لـ BeginTransaction().
فقط "مخزن طراز UML" يتأثر بهذه العمليات. عمليات الطراز لا تؤثر على: متغيرات ، مخازن خارجية مثل الملفات و قواعد البيانات, المخططات الطبقية, مخططات التسلسل المنشأة من تعليمات برمجية, و طرازات تعليمات برمجية.
المثال
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
using Microsoft.VisualStudio.Uml.Interfaces;
using Microsoft.VisualStudio.Uml.Classes;
using Microsoft.VisualStudio.Uml.Extensions;
using System.Linq;
using System.ComponentModel.Composition;
...
[Import]
public ILinkedUndoContext LinkedUndoContext { get; set; }
/// <summary>
/// Swap the names of the currently selected elements.
/// </summary>
public void Execute(IMenuCommand command)
{
var selectedShapes =
Context.CurrentDiagram.GetSelectedShapes<IClassifier>();
if (selectedShapes.Count() < 2) return;
IClassifier firstElement = selectedShapes.First().Element;
IClassifier lastElement = selectedShapes.Last().Element;
string firstName = firstElement.Name;
// Perform changes inside a transaction so that undo
// works as a single change.
using (ILinkedUndoTransaction transaction =
LinkedUndoContext.BeginTransaction("Swap names"))
{
firstElement.Name = lastElement.Name;
lastElement.Name = firstName;
transaction.Commit();
}
}