2017-02-24 8 views
1

私は、同じメソッド本体を持つ3つのメソッドを持つコントローラを持っています。唯一の違いは、メソッドタイプです。私はコントローラーに注入しているジェネリックタイプのインターフェースを持っています。私はIoC(StructureMap)を使用しているため、インターフェイスを注入しています。Web APIコントロールを使用したジェネリックを使用

問題は、コントローラメソッドの戻り値の型が、インターフェイスのメソッドの汎用型と一致しないことです。 (GetStatistics1およびGetStatistics2

デモンストレーションの目的で、私は第3の方法(GetStatistics3)を変更しました。戻り値の型はIEnumerable<T>からIEnumerable<Type3>にキャストしました。コードがコンパイルされますが、それが最も効率的か雄弁な解決策であるかどうかはわかりません。

コードは以下である:

インタフェース:

public interface IStatistics<T> 
{ 
    IEnumerable<T> ExecStatistics_SP(DateTime ? date, 
    int ? xd, string iap, int? statisticsType); 
} 

コントローラー:

public class StatisticsController : ApiController 
{ 
    private readonly IStatistics<T> _repo; 

    public StatisticsController(IStatistics<T> repo) 
    { 
     _repo = repo; 
    } 

    public IEnumerable<Type1> GetStatistics1(string iap, DateTime date, int? statisticsType, int xd) 
    { 
     return _repo.ExecStatistics_SP(date,xd,iap,statisticsType).AsEnumerable(); 
    } 

    public IEnumerable<Type2> GetStatistics2(string aip, DateTime date, int? statisticsType, int xd) 
    { 
     return = _repo.ExecStatistics_SP(date, xd, iap, statisticsType).AsEnumerable(); 
    } 

    public IEnumerable<Type3> GetStatistics3(string iap, DateTime date, int? statisticsType, int xd) 
    { 
     returnValue = _repo.ExecStatistics_SP(date,xd,iap,statisticsType).AsEnumerable(); 
     return (IEnumerable<Type3>) returnValue; 
    } 
} 

答えて

1

TL; DR私はこのウェブAPIで可能である疑い。おそらく、クラスごとに別々のコントローラを作成するのが最良の方法です。

コード自体の問題は、クラス定義にあります。 StatisticsControllerは、Tが何であるかを知らないため、コンパイラはExecStatistics_SPが互換性のある型を返すかどうかをチェックできません。 IStatistics<T>は、クラスの中に注入されているので

さらに、あなたはT各呼び出しの上に反映していない限り、各メソッド内で何T区別する方法はありません。

これにアプローチするもう1つの方法は、言語がすべてを処理し、その過程でクラスを単純化することです。この解決策を使用すると、の内容はType1,Type2、またはType3のいずれかであることがStatisticsControllerの発信者に分かります。実際には、Tは、IStatistics<T>を実装する任意のクラスにすることができます。

public class StatisticsController<T> 
{ 
    private readonly IStatistics<T> _repo; 

    public StatisticsController(IStatistics<T> repo) 
    { 
     _repo = repo; 
    } 

    public IEnumerable<T> GetStatistics(string iap, DateTime date, int? statisticsType, int xd) 
    { 
     return _repo.ExecStatistics_SP(date, xd, iap, statisticsType); 
    } 
} 

私はあなたのDIフレームワークは、Web APIのコンテキストでこれをどのように処理するかわからないんだけど、誰GetStatisticsを呼び出すことは、すでにIStatistics<T>を実装するタイプでStatisticsControllerをインスタンス化している必要があります。独自のコードでの使用には、次のようになります。

var repo = new StatisticsRepo<Type1>(); // Made-up repo class 
var controller = new StatisticsController<Type1>(repo); 
IEnumerable<Type1> values = controller.GetStatistics(...); 
// etc 
+0

サイドノート:私はもともと[共分散](https://msdn.microsoft.com/en-us/library/dd799517(Vでこれを解決しようとしました= vs.110).aspx)しかし、私はそれを把握できませんでした。 – Scott

+0

ありがとうScott。確かめます。 – user1647160

関連する問題