2013-12-16 59 views
0

我知道这个主题有很多问题。然而,我很困惑为什么我在这种情况下得到这个异常。ObjectDataSource通用无参数选择方法

例外

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> 

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

回答

0

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

使用这种适配器控制所有可能的参数组合比试图从一个方块创建一个圆圈更容易(阅读:使您的通用存储库直接作为对象数据源的数据提供者工作)。

+0

到了一天结束时,我一直在想同样的事情,默默地希望能有一个更简单的解决方案。为了让我的生活更轻松一些,我会将该方法放在用户控件或存储库中。第一个更可能。 – Santhos

0

因此,我创建的用户控件的方法应该工作作为适配器:

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

,并设置ObjectDataSource控件的类型名在用户控件这样的Page_Load方法:

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

它似乎在工作。不过,我最近发现,当你设置了DataObjectTypeName时,ObjectDataSource的InsertMethod会被窃听,所以ObjectDataSource的可用性是相当可疑的。