MVC3アプリ内で、ドロップダウンリスト(DDL)のレコードを取得する呼び出し用の一般的なクラス(以下ではDdlGetという名前)を作成しようとしています。以下のコードは意図したとおりに動作しますが、ジェネリック型Tの使用をオーバーベークしていると思います。具体的には、以下に「// **」で示されている行です。
コントローラに次のコードがあります
private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;
...
public StatusController() : this(...new StatusTypeRepository()) {}
public StatusController(...IGeneralReferenceRepository<StatusType> statusTypeRepository)
{
...
this.statusTypeRepository = statusTypeRepository;
}
...
public ViewResult Index()
{
...
//**** The line below passes a variable (statusTypeRepository) of the Generic
//**** type (StatusType) and additionally calls the class (Helper<StatusType>)
//**** with the Generic
indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository);
次に、私のリポジトリで(これは、データベースからDDLのレコードを取得するための実装を定義します[Entity Frameworkメソッドを介して])-一般的な参照ジェネリックインターフェイス(IGeneralReferenceRepository)に注意してください
public class StatusTypeRepository : IStatusTypeRepository, IGeneralReferenceRepository<StatusType>
{
...
public IQueryable<StatusType> All
{
get { return context.StatusTypes; }
}
私はインターフェースを持っています(これは上記で呼び出されているAllメソッドに対応します)
public interface IGeneralReferenceRepository<T>
{
IQueryable<T> All { get; }
}
ドロップダウンリストのレコードを取得してSelectListに配置するためのヘルパークラス
public class Helper<T>
{
public static SelectList DdlGet(IGeneralReferenceRepository<T> generalReferenceRepository)
{
return new SelectList(generalReferenceRepository.All, ...);
}
}
私が抱えている問題は、上記の最初のコードブロックに示されている行です。つまり、SelectListに入力される最終的な実装の呼び出しです。
indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository);
上記のコメントで説明されているように(接頭辞// * *)、これは次の行を介してタイプを定義するGenericstatusTypeRepositoryを渡します:-
private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;
ただし、私はすでにHelper Genericクラス(つまり、Helperクラス)で型を定義しています。
私が持っている質問は、呼び出しでジェネリックを2回指定するのではなく、一方を他方から導出できるかどうかです。つまり、statusTypeRepositoryで指定されたタイプをHelperクラスタイプから派生させることはできますか、またはその逆は可能です。
トラビスに感謝します