2012-11-02 14 views
2

我想擺脫使用NDepend代碼庫中的死代碼。由於我們使用依賴注入我想找到從註冊表基地僅派生類中使用的接口(和實現):查找代碼只用於特殊類通過NDepend

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

有沒有辦法做到這一點?

謝謝!

回答

1

試圖一點點後,我創建了一個在工作方式的查詢,我需要:

// <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 

沒有儘可能多的代碼如我所料:-)此查詢不包括任何可能發生的,但它是一個好的開始。

不過:帕特里克,感謝您的幫助!


歡迎您波多黎各:)順便說一句,這個編碼規則可以寫成這樣,在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 } 
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是密封的,所以它不是你所談論的類。但是你可以用你自己的類名替換它,前面加上名字空間。

+0

感謝您的回覆!這不正是我所需要的:上面的例子給我所有使用我的註冊表基類型的類型。但我需要知道註冊表中使用的僅**的代碼。你明白我的意思嗎?提前致謝! – core

+0

*僅用於註冊表中的代碼*是指.NET Fx類中使用的代碼* Microsoft.Win32.Registry *和* Microsoft.Win32.Registry *中使用的類以及...和等等?或者你的意思是在註冊表中訪問的密鑰? –

+0

你好。不,我的意思是在StructureMap.Configuration.DSL.Registry的類型中使用的代碼。它用於配置我們的依賴注入容器。我的目標是找到僅在這些類中使用的類型和接口,並且不會在我們的代碼庫中找到其他位置。這意味着找到的類型只是註冊但沒有使用,所以它是可以被刪除的死代碼。 由於我們使用的是依賴注入和TDD,所以很難找到死代碼,因爲至少通過測試類和注入DI容器來使用代碼,如上所述。謝謝! – core