代码改变世界

NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题

2010-06-17 20:00  Virus-BeautyCode  阅读(2228)  评论(2编辑  收藏  举报

  概况

  大部分的应用都会包含一些跨越逻辑层和物理层的通用功能。这些功能包括:用户认证、授权、缓存、通信、异常管理、日志、基础框架和合法性验证。这些功能通常被叫做“跨层关注”,因为它会影响整个应用,应该尽可能将他们的代码集中在一起。如果这类代码散落在各个地方,需要修改的时候,就需要打开每个地方进行修改;如果集中管理的话,只需要打开一个地方,修改一个地方就可以了。

  通常的设计考虑

  在设计跨层关注功能的时候,可以考虑下面的因素:

  •   检查在每层的功能需求,找到可以抽象出来的功能,这类功能很可能在应用的其他地方也会用到。
  •   依赖于应用的物理层和逻辑层部署方式,可能需要在多个物理层部署跨层关注组件。但是你仍然会得到独立跨层组件在可复用性和减少开发时间方面带来的好处。
  •   考虑使用DI依赖注入的方式,在配置的基础上,将跨层组件的实例注入到应用中。这将会允许你很容易的修改组件的实现,而不用重新编译和部署整个应用的代码。可以参考:模式和实践小组,Unity。
  •   考虑使用第三方的组件,可以减少开发时间。例如:模式&实践小组的企业库。
  •   考虑使用AOP技术将跨层关注编织到应用中,而不是硬编码到应用中。Unity和企业库的Policy Injection Application Block支持这种方式。另一个是Castle Windsor和PostSharp。

  特殊的设计问题

  通常碰到的设计问题包括:

  •   用户验证
  •   授权
  •   缓存
  •   通信
  •   配置管理
  •   异常管理
  •   日志和性能指标
  •   状态管理
  •   数据验证

  1 用户验证

  设计一个好的用户验证策略对于应用的安全性和可靠性来说是非常重要的。在设计的时候,可以参考下面的原则:

  •   确定你的可信边界,需要验证的用户,以及跨越可信边界的调用。
  •   强制使用密码策略。
  •   如果有多个系统,用户一定要跨越多个系统,考虑使用SSO。
  •   不要明文传输密码,不要明文存储密码。应该存储密码的哈希值。

  2 授权

  •   确认你的可信边界,需要验证的用户,以及跨越可信边界的调用。
  •   通过用户的身份来保护资源。
  •   考虑使用角色为基础的业务授权机制。
  •   考虑使用ACL。

  3 缓存

  •   为缓存选择适当的位置。如果在web服务器场的环境使用缓存,避免使用本地缓存,因为还需要数据同步。考虑使用是分布式缓存,Memcached或者是Velocity。
  •   考虑在内存中缓存强类型的数据,而不是数据库的原始形式DataRow之类的,缓存对象方便使用。
  •   不要缓存敏感数据。
  •   不要依赖于缓存的数据, 因为它有可能已经被移除了。在访问缓存数据失败的时候,从数据源重新获取数据。
  •   在多线程访问缓存的时候,需要特别小心,确保是线程安全的。

  4 通信

  5 配置管理

  6 异常管理

  7  日志和仪表盘

  8 状态管理

  9 数据验证

  缓存的设计步骤

  1 确定缓存的数据

  2 确定数据缓存的位置

  3 确定数据缓存的格式

  4 确定一个适当的数据缓存策略

  5 确定如何加载数据到缓存

  异常管理的设计

  1 确定要处理的异常

  2 确定异常发现策略

  3 确定异常传播策略

  4 确定自定义异常策略

  5 确定收集适当的异常信息

  6 确定异常日志记录策略

  7 确定异常通知策略

  8 确定如何处理未预期的异常

  设计输入和数据验证

  1 确定可信边界

  2 确定关键的方案

  3 确定在什么位置进行数据验证

  4 确定验证策略