Ejemplo n.º 1
0
        private static void Build(string path)
        {
            var app = new Application();

            app.LoadAssemblies(path);

            var apiEntryPoints = app.GetEntryPoints("Monex.*Controller$", "FXDB.*Controller$", "FXDB2.Services.*Service$");

            Func <TypeReference, bool> filter = x => x.Namespace.StartsWith("Monex") || x.Namespace.Contains("FXDB");

            var xx = app.InheritanceMap.OrderByDescending(x => x.Value.Count)
                     .Where(x => filter(x.Key))
                     .Take(10).ToList();

            //Func<TypeReference, bool> filter = x => x.Namespace.Contains("RZD");
            //Func<TypeReference, bool> filter = x => x.Namespace.Contains("Scenario02");
            //Func<TypeReference, bool> filter = null;
            //Func<TypeReference, bool> filter = x => !x.Namespace.StartsWith("System");

            var repoInterfaces = app.AllTypes.InterfacesOnly().ToList();
            var allTypes       = app.AllTypes
                                 .Filtered(".*$")
                                 .Where(filter)
                                 .Resolve()
                                 .ToList();
            var allTypesDef = allTypes.Resolve();

            Func <TaggedEdge <string, List <Relation> >, TaggedEdge <string, List <Relation> >, TaggedEdge <string, List <Relation> > >
            edgeMergeFunc = (e1, e2) => new TaggedEdge <string, List <Relation> >(e1.Source, e2.Target, e1.Tag.Concat(e2.Tag).ToList());

            var g1  = app.BuildDependencyGraph(apiEntryPoints, filter);
            var g1s = g1.SerializeToGraphviz();

            //g1.DeleteVerticesAndMergeEdges(x => x.EndsWith("Dto"), edgeMergeFunc);
            //g1.DeleteVerticesAndMergeEdges(x => x.Contains("Monex.Dto"), edgeMergeFunc);
            //g1.DeleteVerticesAndMergeEdges(x => x.Contains("Monex.Data"), edgeMergeFunc);
            //g1.DeleteVerticesAndMergeEdges(x => x.Contains("Monex.Core"), edgeMergeFunc);
            //var g1s1 = g1.SerializeToGraphviz();


            var incorrect = g1.Edges.Where(x => x.Source.EndsWith("IUnitOfWork") && x.Target.EndsWith("MembershipUnitOfWork")).ToList();

            incorrect.ForEach(x => g1.RemoveEdge(x));


            // var g2 = allTypes.BuildDependencyGraph();
            var g3 = new BidirectionalGraph <string, TaggedEdge <string, List <Relation> > >(false);


            var dbContexts = app.AllTypes.Filtered("DbContext$").ToList();
            var targets    = app.AllTypes.Where(x => x.Name.Contains("OrbisXmlDataParser") || x.Name.Contains("Twilio")).ToList();

            var paths1 = g1.GetAllPaths(apiEntryPoints.Select(x => x.FullName), targets.Select(x => x.FullName)).ToList();

            var gs2  = g1.BuildMinimumSpanningTree(apiEntryPoints.Select(x => x.FullName), targets.Select(x => x.FullName));
            var gs2s = gs2.SerializeToGraphviz();

            var allNodes = paths1.SelectMany(x => x.SelectMany(y => new[] { y.Source, y.Target })).Distinct().ToList();

            var entryPointsConnected = paths1.Select(x => x.First().Source).Distinct().Ordered()
                                       .ToList();

            var xxx = string.Join("\n", entryPointsConnected);

            // var paths2 = g2.GetAllPaths(apiEntryPoints.Select(x => x.FullName), targets.Select(x => x.FullName)).ToList();
            var verticiesToRemove = g1.Vertices.Except(allNodes).ToList();

            g1.DeleteVerticesAndMergeEdges(verticiesToRemove,
                                           (e1, e2) => new TaggedEdge <string, List <Relation> >(e1.Source, e2.Target, null));

            var gs3s = g1.SerializeToGraphviz();

            //g1.CutNonReachable(entries.Select(x => x.FullName));


            var g2s = g3.SerializeToGraphviz();

            var allPaths       = new List <IEnumerable <TypeReference> >();
            var allPathStrings = new List <string>();

            var sourceTypes = allTypesDef.Filtered(".*Service$")
                              .Union(allTypesDef.Filtered(".*Controller"))
                              .ClassesOnly()
                              .Select(x => x.FullName)
                              .ToList();

            var targetTypes1 = allTypesDef.Filtered(".*Program$")
                               .Union(allTypesDef.Filtered(".*Context$"))
                               .Union(allTypesDef.Filtered(".*Global.*$"))
                               .Union(allTypesDef.Filtered(".*Repository.*$"))
                               .Union(allTypesDef.Filtered(".*FxdbModel.*$"))
                               .Select(x => x.FullName)
                               .ToList();


            var targetTypes = allTypesDef
                              //.Filtered("F.*Context$")
                              .IncludingNested()
                              .Filtered("Membership$")
                              .ClassesOnly()
                              .Select(x => x.FullName)
                              .ToHashSet();


            var gs1 = g1.BuildMinimumSpanningTree(sourceTypes, targetTypes);

            foreach (var item in allPaths)
            {
                var pathString = string.Join(" -> ", item.Select(x => x.GetShortName()));
                allPathStrings.Add(pathString);
            }


            //var dbContextTypes = app.GetTypes("FxdbContext$").ToList();
            //var repoTypes = app.GetTypes("Repository$").ToList();
        }