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^2)の代わりにO(N)で実行されるようにこのように書き直すことができます (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 に答える