【问题标题】:How to use ToDataSourceResult from KendoUI in Onion Architecture withouth exposing IQueryable如何在 Onion 架构中使用 Kendo UI 中的 ToDataSourceResult 而不暴露 IQueryable
【发布时间】:2015-06-11 03:49:54
【问题描述】:

我正在使用 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 还是在某种程度上损害我的架构?

【问题讨论】:

  • 我也有同样的问题,看来您需要将 syste.web.mvc 的依赖项添加到数据层才能使其正常工作。有点痛苦。
  • 似乎您必须选择毒药:要么在数据层中放置对 Kendo 的引用,要么在 Api 层中放置对实体的引用。

标签: asp.net-mvc linq kendo-grid onion-architecture


【解决方案1】:

没有参考剑道的仓库方法:

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

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多