【问题标题】:NDepend Query to show const, enum, struct dependenciesNDepend 查询以显示 const、枚举、结构依赖项
【发布时间】:2015-06-03 08:41:09
【问题描述】:

我编写了以下查询以确定我的解决方案与其他程序集之间的依赖关系。我们有一个广泛使用的内部 Nuget 共享库的大型库,我想确保包含这些库 - 因此我在下面使用“t”来消除某些 3rd 方程序集,但包括我们的内部库。

这个查询很好用,但我意识到它只向我们显示依赖关系是方法调用的依赖关系。它不包括常量、枚举和结构。

如何增强下面的查询以向我们展示这些和任何其他依赖项的详细信息?

let t = Assemblies.WithNameWildcardMatchIn("xunit","RestSharp","NSubstitute","O2S*","EntityFramework","AxInterop*","AutoMapper","Autofac*","ADODB","mscorlib","System*", "Microsoft*","Infra*","Interop*").ToDictionary<IAssembly,String>(c=>c.Name)
from a in Application.Assemblies
from m in a.ChildMethods
from b in m.MethodsCalled
let isThirdParty = t.ContainsKey(b.ParentAssembly.Name)

select new { a,isThirdParty,m.ParentNamespace, m.ParentType,m.Name,DependsOnAssembly=b.ParentAssembly.Name, DependsOnNamespace=b.ParentNamespace,DependsOnParentType=b.ParentType,DependsOnMethod=b.Name}

【问题讨论】:

    标签: ndepend


    【解决方案1】:

    您的查询的重构版本怎么样:

    from a in Application.Assemblies
    from m in a.ChildMethods
    from b in m.MethodsCalled.Cast<IMember>().Union(m.FieldsUsed.Cast<IMember>())
    let isThirdParty = b.IsThirdParty
    
    select new { 
       a,
       isThirdParty,
       m.ParentNamespace, 
       m.ParentType,
       m.Name,
    
       DependsOnAssembly=b.ParentAssembly.Name, 
       DependsOnNamespace=b.ParentNamespace,
       DependsOnParentType=b.ParentType,
       DependsOnMember=b.Name
    }
    

    首先我们使用b.IsThirdParty 大大简化了它:)

    其次,我们在MethodsCalledFieldsUsed 之间进行Union&lt;IMember&gt;()。因此,除了调用的方法之外,您还可以读取和/或分配所有字段。

    关于结构的使用,只要您使用结构的成员(构造函数、属性、字段...),就会列出依赖项。

    关于枚举,如果方法使用枚举,您将看到对实例字段 EnumName.value__ 的依赖。

    但是,您不会看到常量或枚举值的用法。原因是这些信息在 NDepend 分析的 IL 代码中丢失了。常量(枚举值也是常量)在 IL 代码中被替换为它们的值。

    希望有帮助!


    附带说明一下,如果您改为编写查询结果,在 NDepend UI 中是不是更具可读性:

    from m in Application.Methods
    select new { 
       m,
       thirdPartyMethodsCalled = m.MethodsCalled.Where(m1 => m1.IsThirdParty),
       applicationMethodsCalled = m.MethodsCalled.Where(m1 => !m1.IsThirdParty),
       thirdPartyFieldsUsed = m.FieldsUsed.Where(m1 => m1.IsThirdParty),
       applicationFieldsUsed = m.FieldsUsed.Where(m1 => m1.IsThirdParty)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多