数据访问库:如果不允许访问或未找到数据,应返回什么?

时间:2011-07-12 09:06:30

标签: c# architecture data-access-layer privileges


我正在为基于小部件的报告应用程序构建DAL,它的设计方式使用户可以选择,配置和部署报告“小部件”到他们的主屏幕。小部件可以报告各种公司数据 - 网站,品牌,员工等。

虽然所有用户都可以访问所有小部件/报告,但所有用户都无权访问所有数据。如果我在公司A工作,我无法查看公司B的销售报告或公司C的销售人员的员工出勤数据,但我可以配置此类报告并将其添加到我的'仪表盘”。

在运行时,中间“DataService”类的工作是检查用户的凭据,如果允许访问,则将相应的对象集合返回给客户端。

在初始构建中,如果不允许访问数据,我只返回一个空列表,但如果报告没有返回任何数据(这可能发生),这也是我所做的。如果用户没有被授权查看数据,我想在前端显示“拒绝访问”消息,但显然如果我在任何可能的情况下都回来是一个空集合,那么就不可能知道这是否是因为保险权利或没有数据。

如果您可以建议一种编码方式,我将不胜感激,我的第一个想法是将凭证检查移动到另一个对象,而该对象又调用数据访问类但时间限制意味着这不是一个选项

我唯一可以想到的,就是我所学到的一切,就是抛出一个自定义异常,例如: InsufficientApplicationPrivilegeException如果未授予访问权限,但这闻起来很糟糕。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

我认为你有几个选择。一种是创建数据服务类返回的复合对象。复合对象看起来像这样: -

class DataResult<T>
{
   IEnumerable<T> Data;
   Result ServiceResult;
}

ServiceResult包含有关服务调用结果的元数据 - 它可能是一个枚举,其中包含例如成功,AuthenticationFailure等等。然后您可以打开它以执行不同的行为。

另一种选择可能是使用NullObject模式,该模式在视图中显示单个数据项,而不是实际数据仅显示对象的显示属性的“拒绝访问”。这种方法的优点是你的前端不需要任何条件逻辑等。但是,如果您想要显示特定的消息框或类似消息框而不是仅在窗口小部件中显示虚拟数据行,那么这可能不合适。