我正在尝试使用 NDepend 删除我们代码库中的死代码。由于我们使用的是依赖注入,我想找到仅在从注册表库派生的类中使用的接口(和实现):
public class PresenterRegistry : Registry
{
public PresenterRegistry()
{
For<IExamplePresenter>().Use<ExamplePresenter>();
}
}
有没有办法做到这一点?
谢谢!
我正在尝试使用 NDepend 删除我们代码库中的死代码。由于我们使用的是依赖注入,我想找到仅在从注册表库派生的类中使用的接口(和实现):
public class PresenterRegistry : Registry
{
public PresenterRegistry()
{
For<IExamplePresenter>().Use<ExamplePresenter>();
}
}
有没有办法做到这一点?
谢谢!
在尝试了一点之后,我创建了一个按我需要的方式工作的查询:
// <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 }
我不确定你的要求是什么。
我想查找仅在派生自注册表库的类中使用的接口(和实现):以下查询与派生自的任何类型使用的应用程序接口和类匹配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
是密封的,所以它不是你在谈论的类。但是你可以用你自己的类名替换它,前缀为命名空间。