2012-11-02 4 views
2

NDepend를 사용하여 코드베이스에서 사용하지 않는 코드를 제거하려고합니다. 우리는 내가 레지스트리 기반에서 파생 클래스 만에 사용되는 인터페이스 (및 구현)를 찾으려면 의존성 주입을 사용하고 있기 때문에 :NDepend를 통해 특수 클래스에서만 사용되는 코드 찾기

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

이 할 수있는 방법이 있습니까?

감사합니다.

답변

1

는 조금 노력 후에 나는 내가 원하는 방식으로 작동하고 쿼리를 생성 좋은 시작.

그럼에도 불구하고 : 패트릭, 도와 줘서 고마워!


당신은 대신 O의, BTW 코드 규칙이 O (N)에서 실행되는이 방법을 쓸 수있다 환영 리코 :)입니다 (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 

, BTW Microsoft.Win32.Registry 밀봉, 그래서 당신이 얘기 클래스가 아닙니다. 하지만 네임 스페이스 접두사가 붙은 자신의 클래스 이름으로 바꿀 수 있습니다. 이 쿼리는 어떤 우발적 사건을 포함하지 않습니다 :-) 내가 예상대로

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

하지 많은 코드를하지만은 다음과 같습니다

+0

답장을 보내 주셔서 감사합니다. 그게 정확히 내가 원하는 건 아니에요 : 위의 예제는 내 레지스트리 기본 유형에서 사용되는 모든 유형을 제공합니다. 그러나 ** 레지스트리에서 ** 사용되는 ** 코드를 알아야합니다. 무슨 뜻인지 알 겠어? 미리 감사드립니다! – core

+0

* 레지스트리에서만 사용되는 코드 * .NET Fx 클래스에서 사용되는 코드 * Microsoft.Win32.Registry * 및 * Microsoft.Win32.Registry *에서 사용되는 클래스 및 ... 및 ...에서 사용되는 클래스를 의미합니까? 곧? 아니면 레지스트리에서 액세스되는 키를 의미합니까? –

+0

안녕하세요. 아니, StructureMap.Configuration.DSL.Registry의 유형에 사용되는 코드를 의미하는 것은 아닙니다. 의존성 주입 컨테이너의 구성을위한 것입니다. 내 목표는 이러한 클래스에서만 사용되는 유형 및 인터페이스를 코드베이스의 다른 위치에서 찾지 않는 것입니다. 이는 발견 된 유형이 등록되었지만 사용되지 않았 음을 의미하므로 올바르게 삭제 될 수있는 불필요한 코드입니다. 의존성 삽입과 TDD를 사용하고 있기 때문에 코드는 적어도 테스트 클래스와 DI 컨테이너에 대한 등록에 사용되기 때문에 죽은 코드를 찾기가 어렵습니다. 감사! – core

관련 문제