2015-04-06 67 views
3

我正在设计使用Onion体系结构的应用程序,并且我想使用Kendo UI中的网格进行服务器端过滤排序和分页。我想避免手动将DataSourceRequest解析为动态LinQ,而是使用ToDataSourceResult。如何从KendoUI在Onion体系结构中使用ToDataSourceResult而不公开IQueryable

我来工作的解决方案,在我的控制器包含以下内容:

private ISalesService salesService; 

    public HomeController(ISalesService salesService) 
    { 
     this.salesService = salesService; 
    } 

    public JsonResult Post([DataSourceRequest] DataSourceRequest request) 
    { 
     var sales = salesService.GetQueryableSales(); 

     return Json(sales , JsonRequestBehavior.AllowGet); 

    } 

ISalesService被马培德实施,我使用存储库,用下面的代码:

public IQueryable<SalesOrderHeader> GetQueryableSales() 
    { 
     if (context == null) 
      context = new AdventureWorks2012Context(); 

     return context.SalesOrderHeaders; 
    } 

这只是一个骨架的应用程序,所以在服务和存储库中没有逻辑。这样我就可以避免手动解析DataSourceRequest,但需要将IQueryable公开给MVC层。我想保留库内的IQueryable,如果可能的话暴露IEnumerable,或者可能来自Kendo UI库的DataSourceResult。

我试图改变我的仓库电话如下:

public DataSourceResult GetSales(DataSourceRequest request) 
    { 
     using (var c = new AdventureWorks2012Context()) 
     { 
      var headersQuery = c.SalesOrderHeaders; 

      var result = headersQuery.ToDataSourceResult(request); 

      return result; 
     } 
    } 

这样我可以保持IQueryabl内部存储库和仍然使用自动DataSourceRequest转化成剑道UI提供动态LINQ的支持。但是这需要从我的数据层引用Kendo.Mvc和System.Web.Mvc,这似乎不是一个好的选择。

所以我的问题是,是否有可能自动将DataSourceRequest转换为LinQ,而不会影响应用程序分层?我在Kendo UI架构中遗漏了什么?或者,我必须选择手动解析DataSourceRequest,还是要牺牲我的体系结构?

+0

我有同样的问题,似乎你需要将依赖关系添加到syste.web.mvc到数据层才能使其工作。一种痛苦。 – lucuma

回答

2

没有提到剑道库方法:

public T GetSales<T>(Func<IQueryable<SalesOrderHeader>, T> processQueryable) 
{ 
    using (var c = new AdventureWorks2012Context()) 
    { 
     return processQueryable(c.SalesOrderHeaders); 
    } 
} 

要使用它,你需要一个函数来处理的IQueryable为参数,在这种情况下,它会返回一个DataSourceResult:

public JsonResult Post([DataSourceRequest] DataSourceRequest request) 
{ 
    DataSourceResult sales = salesService.GetSales<DataSourceResult>(headersQuery=>headersQuery.ToDataSourceResult(request)); 

    return Json(sales , JsonRequestBehavior.AllowGet); 
}