Pravidla šířící změny v modelu
Můžete vytvořit pravidlo úložiště k šíření změnu od jednoho prvku do jiného vizualizaci a modelování SDK (VMSDK).Při změně libovolný prvek v úložišti, pravidla jsou naplánovány, obvykle při spuštěn vnější transakce.Existují různé typy pravidel pro různé druhy události, jako je například přidání prvku nebo jeho odstranění.Pravidla lze přiřadit určité typy prvků, obrazců nebo diagramů.Pravidla jsou definovány mnoho vestavěných funkcí: například pravidla zajišťují, že diagramu je aktualizován při změně modelu.Domény specifické pro jazyk můžete upravit přidáním vlastních pravidel.
Úložiště pravidel jsou zvláště užitečné pro prvky modelu, vztahy, obrazců nebo spojnice a jejich domény rozmnožovací změny uvnitř úložiště – to znamená, že změny vlastnosti.Pravidla nelze spustit, když uživatel spustí příkazy Zpět nebo znovu.Místo toho správce transakcí zajišťuje, že obsah úložiště jsou obnoveny do správného stavu.Pokud chcete rozšířit změny zdrojů mimo obchod, použijte ukládat události.Další informace naleznete v tématu Obslužné rutiny události šíří změny mimo model.
Předpokládejme například, že chcete určit, že kdykoli uživatel (nebo kódu) vytvoří nový prvek typu ExampleDomainClass, další prvek jiného typu je vytvořen v jiné části modelu.Nelze zapsat AddRule a spojit s ExampleDomainClass.Kód píšete pravidlo vytvořit další prvek.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.Modeling;
namespace ExampleNamespace
{
// Attribute associates the rule with a domain class:
[RuleOn(typeof(ExampleDomainClass), FireTime=TimeToFire.TopLevelCommit)]
// The rule is a class derived from one of the abstract rules:
class MyAddRule : AddRule
{
// Override the abstract method:
public override void ElementAdded(ElementAddedEventArgs e)
{
base.ElementAdded(e);
ExampleDomainClass element = e.ModelElement;
Store store = element.Store;
// Ignore this call if we're currently loading a model:
if (store.TransactionManager.CurrentTransaction.IsSerializing)
return;
// Code here propagates change as required – for example:
AnotherDomainClass echo = new AnotherDomainClass(element.Partition);
echo.Name = element.Name;
echo.Parent = element.Parent;
}
}
// The rule must be registered:
public partial class ExampleDomainModel
{
protected override Type[] GetCustomDomainModelTypes()
{
List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
types.Add(typeof(MyAddRule));
// If you add more rules, list them here.
return types.ToArray();
}
}
}
[!POZNÁMKA]
Kód pravidla by měla změnit stav pouze prvky uvnitř skladu; pravidla by měla změnit, pouze prvky modelu, vztahy, tvary, konektory, diagramy nebo jejich vlastnosti.Pokud chcete rozšířit změny zdrojů mimo obchod, definujte, ukládat události.Další informace získáte v tématu Obslužné rutiny události šíří změny mimo model
Definovat pravidla
Definovat pravidlo s předponou třídy RuleOn atributu.Atribut přidruží pravidlo jedné domény tříd, vztahy nebo prvků diagramu.Pravidlo bude použito u všech instancí této třídy, které mohou být abstraktní.
Registrovat pravidlo přidáním k sadě vrácené GetCustomDomainModelTypes() ve své třídě modelu domény.
Z jednoho abstraktní třídy pravidlo odvození třídy pravidlo a kód spuštění metody.
Následující oddíly popisují postup podrobněji.
Definovat pravidla pro třídu domény
V souboru vlastní kód, definovat třídu a předponu s RuleOnAttribute atribut:
[RuleOn(typeof(ExampleElement), // Usual value – but required, because it is not the default: FireTime = TimeToFire.TopLevelCommit)] class MyRule ...
Typ subjektu v prvním parametru může být třída domény, vztah domény, tvar, spojnice nebo diagramu.Obvykle použít pravidla pro třídy domény a vztahy.
The FireTime is usually TopLevelCommit.Tím je zajištěno spuštění pravidla pouze poté, co byly provedeny všechny změny primární transakce.Alternativy jsou vložené, která pravidlo zpracuje brzy po změně; a LocalCommit, která zpracuje pravidlo na konci aktuální transakce (což nemusí být krajních).Můžete také nastavit prioritu pravidla ovlivnit pořadí ve frontě, ale toto je nespolehlivý metoda pro dosažení požadované výsledky.
Abstraktní třída můžete zadat jako typ subjektu.
Pravidlo se vztahuje na všechny instance třídy předmět.
Výchozí hodnota pro FireTime je TimeToFire.TopLevelCommit.To způsobí, že pravidlo, které mají být provedeny, pokud je vnější transakce potvrzena.Alternativou je TimeToFire.Inline.To způsobí, že pravidlo bude provedena ihned po spouštěcí událost.
Pravidla registrace
Přidat do seznamu typů vrácené pravidlo třídy GetCustomDomainModelTypes v modelu domény:
public partial class ExampleDomainModel { protected override Type[] GetCustomDomainModelTypes() { List<Type> types = new List<Type>(base.GetCustomDomainModelTypes()); types.Add(typeof(MyAddRule)); // If you add more rules, list them here. return types.ToArray(); } }
Pokud si nejste jisti názvem třídy modelu domény, vyhledejte v souboruDsl\GeneratedCode\DomainModel.cs
Tento kód psát vlastní kód souboru projektu DSL.
Napište kód pravidla
Třída pravidlo odvození z jednoho z následujících základních tříd:
Základní třída
Aktivační událost
Doplňuje se prvek, odkaz nebo tvar.
Pomocí tohoto rozpoznat nové vztahy, vedle nové prvky.
Je změněna hodnota vlastnosti domény.Argument metody obsahuje staré a nové hodnoty.
U obrazců, je toto pravidlo spuštěno při integrovaná AbsoluteBounds změny vlastností, pokud je obrazec přesunut.
V mnoha případech je vhodnější pro přepsání OnValueChanged nebo OnValueChanging vlastnosti obslužné rutiny.Tyto metody se nazývají bezprostředně před a po změně.Naopak pravidlo obvykle běží na konci transakce.Další informace naleznete v tématu Obslužná rutina změny hodnoty vlastnosti domény.
[!POZNÁMKA]
Toto pravidlo není spuštěna při vytvoření nebo odstranění odkazu.Místo toho zapsat AddRule a DeleteRule pro vztah domény.
Aktivovaná po prvek nebo propojení bude odstraněno.Vlastnost ModelElement.IsDeleting je až na konci transakce.
Provést po odstranění prvku nebo propojení.Pravidlo je provést po všech pravidel byly provedeny, včetně DeletingRules.ModelElement.IsDeleting hodnotu false a ModelElement.IsDeleted je PRAVDA.Chcete-li povolit pro následné zpět, prvek odebrána z paměti, ale je odebrán z Store.ElementDirectory.
Prvek je přesunuta z úložiště jeden oddíl do druhého.
(Všimněte si, že to nesouvisí grafická pozice obrazce.)
Toto pravidlo platí pouze pro domény vztahy.Je aktivována, pokud výslovně přiřadíte prvek modelu buď konci propojení.
Aktivuje při řazení odkazů z prvku nebo pomocí metody MoveBefore nebo MoveToIndex na odkaz.
Provést při vytvoření transakce.
Při transakce má být spuštěn.
Provádí transakce má být vrácena zpět.
Každá třída má metoda, která je přepsat.Typ override ve své třídě jej zjistit.Parametr této metody identifikuje prvek, který je měněn.
Oznámení o pravidlech následující body:
Změny v rámci transakce mohou být aktivována pravidla mnoho.Pravidla jsou obvykle spouštěny při vnější transakce.Jsou prováděna v nespecifikované pořadí.
Pravidlo je spuštěn vždy uvnitř transakce.Proto není nutné vytvořit novou transakci provést změny
Pravidla nebudou provedeny transakce vrácena zpět nebo pokud jsou operace zpět nebo znovu provést.Tyto operace obnovení obsahu úložiště do předchozího stavu.Proto pokud pravidlo změní stav nic mimo obchod, je pravděpodobně není ponechat v synchronism s úložištěm obsahu.Chcete-li aktualizovat stav mimo obchod, je vhodnější použít události.Další informace naleznete v tématu Obslužné rutiny události šíří změny mimo model.
Některá pravidla jsou spouštěny při načtení modelu ze souboru.Chcete-li zjistit, zda je v průběhu načítání nebo ukládání, použijte store.TransactionManager.CurrentTransaction.IsSerializing.
Pokud kód pravidlo vytvoří další pravidla, aktivační události budou přidány na konec seznamu pálení a bude spuštěn před dokončením transakce.DeletedRules jsou spouštěny po všech ostatních pravidlech.Jedno pravidlo spustit v transakci, jednou pro každou změnu mnohokrát.
Chcete-li předat informace a pravidla lze ukládat informace TransactionContext.Toto je pouze slovník, který je udržována během transakce.Jsou odstraněny při ukončení transakce.Argumentů události v každé pravidlo poskytnout přístup k němu.Nezapomeňte, že pravidla nebudou provedeny své místo.
Použijte pravidla po zvážení jiné alternativy.Například pokud chcete aktualizovat vlastnost při změně hodnoty, zvažte vypočtené vlastnosti.Pokud chcete omezit velikost nebo umístění obrazce, použijte BoundsRule.Pokud chcete reagovat na změnu hodnoty vlastnosti, přidat OnValueChanged popisovač vlastnosti.Další informace naleznete v tématu Reagování na změny a šíření změn.
Příklad
V následujícím příkladu aktualizuje vlastnost při propojení dvou prvků je vytvořena vztah domény.Pravidlo bude spuštěna pouze, když uživatel vytvoří propojení v diagramu, ale také pokud kód programu vytvoří odkaz.
Tento příklad vyzkoušet, vytvořit pomocí šablony úloh tok řešení DSL a vložte následující kód do souboru v projektu Dsl.Sestavit a spustit řešení a otevřete ukázkový soubor projektu ladění.Nakreslete komentáře odkazu mezi obrazcem komentář a prvek toku.Text komentáře změní sestavu na poslední prvek, který jste připojili k.
V praxi by obvykle zapsat DeletRule pro každý AddRule.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.Modeling;
namespace Company.TaskRuleExample
{
[RuleOn(typeof(CommentReferencesSubjects))]
public class RoleRule : AddRule
{
public override void ElementAdded(ElementAddedEventArgs e)
{
base.ElementAdded(e);
CommentReferencesSubjects link = e.ModelElement as CommentReferencesSubjects;
Comment comment = link.Comment;
FlowElement subject = link.Subject;
Transaction current = link.Store.TransactionManager.CurrentTransaction;
// Don't want to run when we're just loading from file:
if (current.IsSerializing) return;
comment.Text = "Flow has " + subject.FlowTo.Count + " outgoing connections";
}
}
public partial class TaskRuleExampleDomainModel
{
protected override Type[] GetCustomDomainModelTypes()
{
List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
types.Add(typeof(RoleRule));
return types.ToArray();
}
}
}