Buenas
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;
- un archivo xml con el contenido del mismo
- un archivo xml con la información de visualizacion del diagrama
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.
Es por eso que las siguientes líneas pueden servirnos de utilidad:
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.
Por ejemplo si lo aplicamos al ejemplo de DSL que he madurado en los últimos posts el código quedaría:
/// <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;
}
y para crear un modelo a partir del Helper el codigo sería mas simple aún:
public void TestLoadModel()
{
string dslPath = "modelo.dsl";
ExampleModel model = Dsl15.DSLHelper.LoadModel(dslPath);
}
Saludos @ La Finca
El Bruno