让我首先为这篇文章的长度道歉,但我想提供尽可能多的细节以增加答案的机会。提前致谢。
我正在向集成来自多个数据库的数据的现有应用程序添加新功能。简而言之,它允许客户和/或其会计师访问和更新有关其位置的财务信息。该应用程序有 3 层,带有一个 Web 客户端(我希望很快将其替换为 Silverlight 客户端)、一个在应用服务器上运行的服务层和一个数据库层。
当我获得所有权时,该应用程序尽管有 3 层,但非常简单。它对一切都使用 ADO.NET,Web 服务只是对其中一个数据库的动态(字符串)SQL 查询的传递。我的第一个任务是“清理”现有代码。该应用程序没有任何面向对象的内容,一切都是平坦的。我已经开始重构应用程序以利用 LINQ-to-SQL,实现了存储库模式以使业务逻辑可测试(更不用说随着我们将数据访问技术从 ADO.NET 发展到 L2S 并希望能够继续到Entity Framework)并重新编写代码以实际使用 .NET 的功能。
在大多数情况下,Web 应用程序是小菜一碟,因为每个页面都是对数据库中的表或视图的简单查询(通过 Web 服务)。在应用服务器端,我最终得到了每个数据库的 DataContext 和每个实体的 Repository(或使用 DDD 术语的聚合根)。我使用构造函数注入 (Castle Windsor) 为我的服务类以及存储库使用的 DataContext 设置正确的存储库实例。
这一切都很好,除了现在我必须将编辑功能添加到需要跨越 4 个数据库的逻辑的应用程序中,而我对正确的方法感到茫然。应用程序的流程和架构必须保持一致且可由初级开发人员维护,这一点至关重要。(除了我,团队基本上都是 VB6 开发人员,他们认为自己正在编程 .NET,因为他们使用 VS 和 BCL——他们对模式、实践、单元测试、模拟等知之甚少)</ p>
让我来看看使编辑视图工作所需的内容:
- 首次加载页面时,我会生成一个“可编辑”会计期间的列表。
- 此列表基于 SQL Server 数据库(称为“元数据”数据库)中包含的一组规则。表中的每一行都按名称标识会计期间以及可以编辑的时间范围。
- 这些规则用于查询 DB2 财务数据库中将期间名称和年份映射到实际日期的表。此查询将返回结束日期在过去和结束日期(结束日期加上上面的编辑长度)在今天之后的所有条目。
- 该页面将默认选定的时间段为最近的时间段。选择一个时间段后,我会触发另一个请求来填充当前用户在所选时间段内可以编辑的位置列表。
- 首先,我必须从“安全”数据库中查询用户的安全信息,并确定他们是否具有会计角色。如果是这样,那么我必须查询元数据数据库以检索当前用户的客户端列表。如果没有,那么我使用当前用户的 clientID。
- 接下来,我查询 DB2 财务数据库以获取位置列表,根据选定的时间段和用户可能访问的客户端 ID 列表进行过滤。我还根据状态进行过滤,因此我只返回在此期间处于活动状态的位置。
- 与期间一样,页面将默认选定位置为列表中的第一个位置。选择位置后,我会再次请求该位置在所选期间的实际财务数据。
- 这个请求是向“暂存”数据库发出的,非常简单。
- 如果用户选择不同的时期或位置,所有这些都会重复。
所以,让我们以 #2 为例,看看我应该如何使用工作单元和存储库模式在我的服务应用程序中实现这一点……哦,有一个问题——没有 LINQ-to-DB2,公司不会制造跳转到 EF,所以在使用该数据库时我只能使用 ADO.NET。但不要让这阻碍你,因为我想要一个尽可能与数据访问技术无关的解决方案,因为他们随时可能改变主意。事实上,就我目前所知,他们可以转变范式并转向 NHibernate。我更关心的是从服务外观到 DataContext,而不是如何实现 DataContext(或 ObjectContext)。
您能否引导我完成使用当前用户的凭据和选定的会计期间调用我的 Web 服务方法的实现,执行上面 #2 中概述的步骤并返回适当的位置列表?
唷......这是很多东西。我很感激帮助整理它。