【问题标题】:Data Access Library: What to return if access isn't allowed or data isn't found?数据访问库:如果不允许访问或未找到数据,返回什么?
【发布时间】:2011-10-03 10:59:48
【问题描述】:

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

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

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

在初始构建中,如果不允许访问数据,我只是返回了一个空列表,但如果报告没有返回任何数据(这可能会发生),我也会这样做。如果用户无权查看数据,我想在前端显示“拒绝访问”消息,但显然,如果我在任何一种情况下得到的只是一个空集合,则无法知道这是否是因为权利不足或没有数据。

如果您能提出一种解决此问题的编码方法,我将不胜感激,我的第一个想法是将凭据检查移至另一个对象,该对象又调用数据访问类,但时间限制意味着这不是一个选项.

我唯一能想到的,与我所学的一切背道而驰的是,抛出一个自定义异常,例如InsufficientApplicationPrivilegeException 如果未授予访问权限,但这闻起来很糟糕。

感谢阅读。

【问题讨论】:

  • 我认为,如果您将 DAL 视为一个独立的实体,并想象在所有消费者都是由第三方完成的工作时,这是您的唯一责任,您可能会提出拒绝访问的例外 -大多数框架都会。但是,如果您想避免 异常逻辑,那么提供功能来帮助消费者确定他们是否有足够的数据访问权限会很有帮助——尽管这听起来更像是一个业务逻辑问题,就是这样控制访问?
  • 我希望将授权作为一个单独的步骤,但正如我所提到的,这一切都必须一次性完成。在这种情况下,您是否认为我可以证明打破仅在出现问题时才使用异常的规则而不是作为控制程序执行的一种方式?另一个担忧是,组织中的每个人都会在他们的仪表板上使用我的小部件,鉴于高可见性,性能是一个主要因素。我正在使用积极缓存的数据,但担心引发异常的相对成本较高。你对此有看法吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复。我将看一下 NullObject 模式,但目前复合对象方法看起来可能是最快和最简单的。 NullObject 是针对此类问题的 DAL 构建世界中的约定吗?
  • 你可以使用 NullObject 来处理一个空对象(或者在你的情况下,一个由身份验证失败引起的空列表),就像你取回“真实数据”一样.因此,您不必到处都有大量 if (!myList.Any()) 调用等,因为“空对象”和真实对象的行为方式相同(在您的情况下,将一些文本显示到小部件控件中) .在您的情况下,我认为复合模式是一个更好的选择;它更灵活,因为您可以扩展 ServiceResult 并在将来根据需要添加更多元数据。
猜你喜欢
  • 2012-05-28
  • 2017-03-02
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多