no es muy usual, pero tal vez en algún momento necesites consumir el contenido de un diagrama creado con Domain Specific Language Tools. Como comenté alguna vez, un diagrama está compuesto de 2 archivos;
Como ambos archivos son representaciones xml, se pueden interpretar utilizando diversas tecnologías:
Esta última opción es la más interesante ya que permite aprovechar toda la potencia de un modelo de clases ya adaptado a un diagrama específico. Pero el problema que se presenta es que la creación de estos componentes no es una tarea trivial y mucho menos intuitiva.
1 using Microsoft.VisualStudio.Modeling.Diagrams;
2 using Microsoft.VisualStudio.Modeling;
3 using System.IO;
4 using System.Xml;
5
6 public <Dsl>RootClassName LoadModel(String fileName)
7 {
8 <Dsl>RootClassName ret = null;
9 Store store = new Store();
10 store.LoadDomainModels(
11 typeof(CoreDesignSurfaceDomainModel),
12 typeof(<Dsl>DomainModel));
13
14 Transaction t = store.TransactionManager.BeginTransaction("Loading Dsl Model");
15 ret = <Dsl>SerializationHelper.Instance.LoadModel(store, fileName, null, null);
16 t.Commit();
17
18 return ret;
19 }
En el ejemplo anterior lo unico que debemos tener en cuenta que el elemento <Dsl> representa el nombre de nuestro proyecto DSL para que lo reemplacemos por la referencia correspondiente.
/// <summary>
/// Loads the model.
/// </summary>
/// <param name="dslPath">The DSL path.</param>
/// <returns></returns>
public static ExampleModel LoadModel(string dslPath)
{
ExampleModel ret = null;
DslModeling.Store store = new DslModeling.Store();
store.LoadDomainModels(
typeof(DslDiagrams.CoreDesignSurfaceDomainModel),
typeof(Dsl15DomainModel));
DslModeling.Transaction t = store.TransactionManager.BeginTransaction("Loading Dsl Model");
ret = Dsl15SerializationHelper.Instance.LoadModel(store, dslPath, null, null);
t.Commit();
return ret;
}
public void TestLoadModel()
{
string dslPath = "modelo.dsl";
ExampleModel model = Dsl15.DSLHelper.LoadModel(dslPath);
}