【问题标题】:ObjectDataSource generic parameterless select methodObjectDataSource 通用无参数选择方法
【发布时间】:2013-12-16 18:40:04
【问题描述】:

我知道关于这个话题有很多问题。但是,我真的很困惑为什么在这种情况下会得到这个异常。

例外情况

ObjectDataSource 'investmentDataSource' could not find a non-generic method 'GetAll' that has no parameters

案例 环境 - .net 3.5、asp、SharePoint 2010(这无关紧要)

存储库对象继承自通用存储库对象,如下所示:

public class InvestmentRepository : Repository<Investment, EntityContext>, IInvestmentRepository
{
    // ...
}

通用存储库如下所示:

public abstract class Repository<TEntity, TContext> : IRepository<TEntity>
        where TEntity : EntityObject, new()
        where TContext : ObjectContext, new()
{
     public IQueryable<TEntity> GetAll()
     {
         // returns all entities from context
     }
}

我想在编译过程中会在 InvestmentRepository 上创建一个方法,如下所示:

public IQueryable<Investment> GetAll()

所以我想当我像这样创建 ObjectDataSource 时:

<asp:ObjectDataSource
    ID="investmentDataSource"
    runat="server" 
    OnObjectCreating="DataSourceObjectCreating" 
    TypeName="Model.InvestmentRepository"
    SelectMethod="GetAll">
</asp:ObjectDataSource>

...它应该可以工作。但是,它不起作用。我正在寻找任何建议。谢谢

【问题讨论】:

    标签: c# asp.net generics objectdatasource


    【解决方案1】:

    建议在您的存储库和您的 ObjectDataSource 之间放置另一个辅助适配器类。

    使用这样的适配器控制所有可能的参数组合比尝试从正方形制作圆形要容易得多(阅读:使您的通用存储库直接作为对象数据源的数据提供者工作)。

    【讨论】:

    • 一天结束时我也这么想,默默地希望有一个更简单的解决方案。为了让我的生活稍微轻松一些,我将把该方法放在用户控件或存储库中。第一种可能性更大。
    【解决方案2】:

    所以我在用户控件上创建了一个应该作为适配器工作的方法:

    public System.Collections.IEnumerable GetInvestments()
    {
        return this.InvestmentRepository.GetAll();
    }
    

    并在用户控件的Page_Load方法中设置ObjectDataSource的TypeName如下:

    this.investmentDataSource.TypeName = this.GetType().AssemblyQualifiedName;
    

    它似乎正在工作。但是最近发现ObjectDataSource的InsertMethod在你设置DataObjectTypeName的时候有bug,所以ObjectDataSource的可用性是很值得怀疑的。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多