【问题标题】:Abstracting Interfaces抽象接口
【发布时间】:2012-05-29 23:57:36
【问题描述】:

在我的 MVC3 应用程序中,我试图创建一个通用类(下面名为 DdlGet)来调用它来获取下拉列表 (DDL) 的记录。下面的代码按预期执行,但我认为我过度使用通用类型 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 记录的实现) - 请注意通用参考通用接口 (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); 

正如上面注释中所解释的(以 //** 为前缀),它传递了一个 Generic statusTypeRepository,它通过以下行定义类型:-

private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;

但是我已经在 Helper Generic 类(即 Helper 类)中定义了类型

我的问题是我是否可以从另一个中派生出一个,而不是在调用中两次指定泛型。即我可以从 Helper 类类型派生 statusTypeRepository 中指定的类型,反之亦然

非常感谢
特拉维斯

【问题讨论】:

    标签: generics interface abstract


    【解决方案1】:

    您可以将类型参数放在 Helper 类中,而不是将其放在方法中,如下所示:

    public class Helper
    {
        public static SelectList DdlGet<T>(IGeneralReferenceRepository<T> generalReferenceRepository)
        {
            return new SelectList(generalReferenceRepository.All, ...);
        }
    }
    

    那你就可以了

    indexViewModel.StatusTypes = Helper.DdlGet(statusTypeRepository); 
    

    编译器会处理类型推断。

    【讨论】:

    • 安德鲁,非常感谢 - 出于某种原因,我认为该类型需要在课堂上
    猜你喜欢
    • 2011-05-22
    • 2017-02-19
    • 2014-04-12
    • 2010-12-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多