2

我正在尝试使用 NDepend 删除我们代码库中的死代码。由于我们使用的是依赖注入,我想找到仅在从注册表库派生的类中使用的接口(和实现):

public class PresenterRegistry : Registry
{
    public PresenterRegistry()
    {
        For<IExamplePresenter>().Use<ExamplePresenter>();
    }
}

有没有办法做到这一点?

谢谢!

4

2 回答 2

2

在尝试了一点之后,我创建了一个按我需要的方式工作的查询:

// <Name>Interfaces registered but potentially not used</Name>
warnif count > 0 
from t in JustMyCode.Types
from i in JustMyCode.Types
where t.DeriveFrom("StructureMap.Configuration.DSL.Registry")
   && i.IsInterface
   && t.IsUsing(i)
   && i.NbTypesUsingMe < 3 // one using for implementation, one in registry
select i

没有我预期的那么多代码:-) 这个查询没有涵盖任何可能性,但它是一个好的开始。

尽管如此:帕特里克,感谢您的帮助!


不客气,Rico :) 顺便说一句,这个代码规则可以用这种方式重写,以在O(N)而不是O(N^2)中运行(N 是JustMyCode.Types的数量)。这种优化是通过神奇的UsedByAny()方法实现的。该规则还提供了更详细的结果。

warnif count > 0 
let registryDerived = JustMyCode.Types.Where(t => t.DeriveFrom("StructureMap.Configuration.DSL.Registry"))
from i in JustMyCode.Types.UsedByAny(registryDerived)
where i.IsInterface &&
      i.NbTypesUsingMe < 3 // one using for implementation, one in registry
select new { i, 
             registryDerivedUser = i.TypesUsingMe.Intersect(registryDerived),
             i.TypesUsingMe }
于 2012-11-07T16:18:34.780 回答
1

我不确定你的要求是什么。

我想查找仅在派生自注册表库的类中使用的接口(和实现):以下查询与派生自的任何类型使用的应用程序接口和类匹配Microsoft.Win32.Registry

let registryDerived = Application.Types.Where(t => t.DeriveFrom("Microsoft.Win32.Registry"))
from t in Application.Types.UsedByAny(registryDerived)
select t

..通过下一个查询,您还可以获得与上一个查询匹配的接口的派生类型和实现:

let registryDerived = Application.Types.Where(t => t.DeriveFrom("Microsoft.Win32.Registry"))
from t in Application.Types.UsedByAny(registryDerived)
let tDerived = t.DerivedTypes
let tImpl = t.TypesThatImplementMe
select new { t, tDerived, tImpl }

...或将它们全部列出:

let registryDerived = Application.Types.Where(t => t.DeriveFrom("Microsoft.Win32.Registry"))

let tUsed = Application.Types.UsedByAny(registryDerived)
let tDerived = tUsed.SelectMany(t => t.DerivedTypes)
let tImpl = tUsed.SelectMany(t => t.TypesThatImplementMe)

from t in tUsed.Union(tDerived).Union(tImpl)
select t

顺便说一句,Microsoft.Win32.Registry是密封的,所以它不是你在谈论的类。但是你可以用你自己的类名替换它,前缀为命名空间。

于 2012-11-03T17:02:06.810 回答