asp.net-mvc – 如何在洋葱架构中使用KendoUI中的ToDataSourceResult而不暴露IQueryable

我正在使用Onion架构设计应用程序,我想使用Kendo UI中的网格与服务器端过滤排序和分页.我想避免手动将DataSourceRequest解析为动态LinQ,而是使用ToDataSourceResult.

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

    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转换为Kendo UI提供的动态LinQ.但这需要从我的数据层引用Kendo.Mvc和System.Web.Mvc,这似乎也不是一个好的选择.

所以我的问题是,是否可以自动将DataSourceRequest转换为LinQ,而不会影响应用程序分层?我在Kendo UI架构中遗漏了什么吗?或者我必须选择手动解析DataSourceRequest还是在某种程度上损害我的架构?

最佳答案 没有引用Kendo的存储库方法:

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);
}
点赞