четверг, декабря 18, 2008

WindsorContainer Visualization

Сегодня простой рецепт.
Как получить на входе WindsorContainer и получить на выходе картинку со всеми сервисами и их зависимостями друг от друга.

1. Идем в Википедию и изучаем две страницы:
DOT Language, Graphviz
Краткое резюме: есть специальный язык для описание графов и программа способная его интерпретировать в нужный нам формат (рисовать картинку, например)

2. Качаем и устанавливаем GraphViz

3. Пишем код:

  public class dump_windsor
    {
    public static void to_dot_file( string filename, IWindsorContainer cont )
      {
      File.WriteAllText( filename, new digraph("windsor", cont.Kernel.GraphNodes).ToString() );
      }

    private class digraph
      {
      private readonly string id;
      private readonly List<graph_node> nodes = new List<graph_node>();

      public digraph( string id, IEnumerable<GraphNode> nodes )
        {
        this.id = id;
        foreach ( var node in nodes )
          foreach ( var dependent in node.Dependents )
            this.nodes.Add( new graph_node( node, dependent ) );
        }

      public override string ToString()
        {
        return String.Format("digraph {0} {{\n\t{1};\n\t{2}\n\t}}", id, String.Join( ";\n\t", nodes.Select( node => node.ToString() ) ), graph_options() );
        }

      private static string graph_options()
        {
        return "graph [ overlap = false ]";
        }
      }

    private class graph_node
      {
      private readonly string left;
      private readonly string right;

      public graph_node(GraphNode left, GraphNode right)
        {
        this.left = gn2string( left );
        this.right = gn2string( right );
        }

      private static string gn2string( GraphNode left )
        {
        return ( (ComponentModel)left ).Name.Replace( '.', '_' );
        }

      public override string ToString()
        {
        return String.Format("{0} -> {1}", left, right );
        }
      }
    
    }

* This source code was highlighted with Source Code Highlighter.


4. В любом месте где контейнер уже наполнен компонентами вызываем: dump_windsor.to_dot_file("c:\\windsor.dot", container);

5. На получившийся файл натравливаем визуализатор:
"%ProgramFiles%\Graphviz 2.21\bin\dot.exe" -Tpng -owindsor.png windsor.dot

6. Смотрим картинку windsor.png. Ловкость рук, никакого мошеничества.

7. Всю картинку конечно здесь не уместить, вот крохотный кусочек для примера, чтоб не порвать страницу :)

Отправить комментарий