1

我看过许多关于制作 SPA(单页应用程序)的教程,其中许多使用外部库(例如轻风和 jaydatajs)来获得自动化的数据服务层。

这些库希望我公开一个他们可以查询的 IQueryable 对象。

我的问题是,从服务器公开 IQueryable 有什么风险?我想知道使用这些 js 库创建这个快捷方式是否值得,或者我应该在服务器中公开我自己的函数并在客户端自己实现数据服务。

问题是,当公开一个 Iqueryable 时,我可以使用例如轻量级的 linq 来创建过滤和分页查询,使用类似 linq 的语法。如果我不使用它,我将不得不在服务器中实现这些用于过滤和分页的功能。并在 javascript 中实现对它们的调用。

我希望我很清楚:-)

4

2 回答 2

5

在公开 IQueryable 时,我尝试做一件事...确保您不公开您的 EF 样式对象,始终确保您有一个可以控制的位于顶部的某种视图模型。

举个例子,假设你的数据库有 User 和 UserSecrets

public class User
{
    public long UserId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<UserSecret> UserSecrets { get; set; }
}

public class UserSecret
{
    public long UserSecretId { get; set; }
    public long UserId { get; set; }
    public string Secret { get; set; }
}

如果您公开IQueryable<User>,您也可以轻松提取 UserSecrets

www.blah.com/users?$expand=UserSecrets

而是公开一个UserViewModel或类似的东西

public class UserViewModel
{
     public string Name { get; set; }
} 

IQueryable<UserViewModel>您可以通过以下方式公开:

return dbContext.Users.Select(u => new UserViewModel { Name = u.Name })

很棒的是,这仍然是IQueryable- 您仍然可以过滤等,它仍将在 db 级别执行,但您可以准确控制可以提取哪些数据(在这种情况下UserSecret不再可访问)。

当然,您也可以应用自己的过滤器,这样您就可以避免用户无法访问他们不允许的数据:

return dbContext.Users.Where(u => ...).Select(u => new UserViewModel { Name = u.Name })
于 2013-04-02T11:43:46.687 回答
0

可以看出您创建了 DTO 对象以投影实体对象并尝试在此 DTO 上创建基本属性。此操作将使我们保护从数据库公开的我们自己的信息,并避免将一些秘密信息从服务端泄露到客户端。

于 2013-04-04T01:54:09.210 回答