2016-11-24 3 views
2

私は自分の状況を簡略化して説明します。リフレクション(C#)を使用してインターフェイスの実装を組み合わせるべきですか?

だから、私は

public interface ITransformer 
{ 
    List<MyClass> Transform(MyClass item); 
} 

変換は本当に異なっているのでMyClassタイプ内でいくつかの変換を作ってるんだ、それは彼らにITransformerのように異なる実装を提供するために、完璧な意味があります。

しかし、今や、すべての可能な変換の結果を組み合わせる必要があります。 GlobalTransformer : ITransformerのようなTransformメソッドは、他のすべての実装を呼び出してその結果を結合します。

意味がありますか?私はそれに反射を使用する必要がありますか?それとも何とか違った方法で問題にアプローチすべきですか?

+0

「ITransformer」を実装するクラスのすべてのインスタンスをどのように追跡するつもりですか?彼らはリストに入っていますか?問題を説明するのに役立つ他のコードがありますか? –

+0

@ GrantWinney私は、コンテキスト固有の混乱を起こすことなく、基本的なアイデアを示しました。実装を(リスト内で、リフレクションやその他を使用して)組み合わせる方法は、今私が決定しようとしていることです。 – Pranasas

答えて

1

私はそのように行くだろう:

public class GlobalTransformer : ITransformer 
{ 
    private readonly IList<ITransformer> _availableTransformers; 

    public GlobalTransformer(IList<ITransformer> availableTransformers) 
    { 
     _availableTransformers = _availableTransformers; 
    } 

    public List<MyClass> override Transform(MyClass item) { 
     List<MyClass> result = new List<MyClass>(); 
     foreach (var item in _availableTransformers) { 
      result.AddRange(item.Transform(item)); 
     } 
     return result; 
    } 
} 

私はその後、一歩を行くと、あなたのGlobalTransformerクラス

にそのリストを注入するAutofacまたはSimpleInjectorのようなIoCを使用することになり、私も強くような反射を避けるだろうそれは遅いです。

1

考えられるすべての変形を知ることはできません。あなたのライブラリを参照しているプロジェクトは、それ自身のITransformerの実装を作成することができ、それについては決して知りません。私はあなたもはそれらについて知りたいだろうと疑問:

とも、あなたができれば

あなたのユニットテストで TestTransformerを作成した場合、あなたは本当に盲目的にそれを適用するのでしょうか?

代わりに、すべてのトランスの実装を手動で追跡していますが、最も単純なケースでは、各トランスのインスタンスが1つずつしか含まれていないList<ITransformer>を使用しています。

+0

あなたの答えをありがとう。提供された考えは有効で非常に興味深いものです。私は他の答えを受け入れることになりました。なぜなら、私の状況になる方法のように見える 'List 'の追跡のプロトタイプコードを与えるからです。 – Pranasas

関連する問題