Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个业务线数据库的.NET应用程序设计_C#_Design Patterns_Architecture_Integration - Fatal编程技术网

C# 具有多个业务线数据库的.NET应用程序设计

C# 具有多个业务线数据库的.NET应用程序设计,c#,design-patterns,architecture,integration,C#,Design Patterns,Architecture,Integration,核心公司数据在物理上独立的第三方业务线应用程序(财务、运输管理)中保存和管理。客户在财务应用程序(SQL Server)中创建,交付信息保存在运输管理应用程序(Oracle)中。两者之间的通信是点对点的 我们需要构建一个新的应用程序(很好地升级了旧的应用程序,但基本上是从头开始)来处理客户对损坏或短交货的索赔。索赔、客户和交货数据当前手动输入MS Access。这将被迁移到SQL server数据库。应用程序开发平台是VS2008(C#) 我希望避免将所有客户和交付数据都保存在索赔数据库中,因为

核心公司数据在物理上独立的第三方业务线应用程序(财务、运输管理)中保存和管理。客户在财务应用程序(SQL Server)中创建,交付信息保存在运输管理应用程序(Oracle)中。两者之间的通信是点对点的

我们需要构建一个新的应用程序(很好地升级了旧的应用程序,但基本上是从头开始)来处理客户对损坏或短交货的索赔。索赔、客户和交货数据当前手动输入MS Access。这将被迁移到SQL server数据库。应用程序开发平台是VS2008(C#)

我希望避免将所有客户和交付数据都保存在索赔数据库中,因为我们已经将其保存在其他地方,因此我计划从LOB系统(可能还有索赔数据库)生成基于WCF的提要,然后将其用作客户索赔应用程序的数据源。将有特定于索赔的数据输入,但不需要在LOB应用程序中更新核心客户和交付数据

到目前为止,我的想法是

数据库-->ORM-->WCF\
数据库-->ORM-->WCF-->BLL-->UI
数据库-->ORM-->WCF/

但感觉不对,因为我将为客户、交付和索赔创建单独的服务提要(面向对象的服务?)。我还不能完全理解的是,我如何以及在哪里加入并跨应用程序中的数据源工作,以生成(比如)一份报告,显示每个客户的交付索赔(即,我传统上在哪里编写一个查询或视图,以从一个数据库中的多个表中获取所有这些数据)


我是在正确的轨道上,还是错过了这里的大局?我是否应该在索赔数据库中运行定期提取,并使用传统的n层/n层体系结构?

在生成报告时,通常可以接受交付的不是最新的数据,因此将单独的数据库作为报告查询的源可能是一个好主意。您的主数据库将从UI接收更新(利用事务和冲突检测),然后将数据复制到报告数据库


这种架构模式称为CQS(命令-查询分离),请阅读Udi Dahan的文章。

我认为您的设计离它应该达到的位置并不太远

如果你有通过WCF服务或传输服务访问金融数据的应用程序,那么构建这些应用程序是有意义的。构建它们也是有意义的,因为这些服务中的每一项都只支持它需要知道的内容(与单一责任原则相联系)

您的UI应用程序需要了解并调用3个独立的服务来完成其工作,这可能会让您感觉不对劲。在这种情况下,我们通常会构建一个包装器服务来调用适当的服务。这意味着您的UI应用程序将引用WCF服务,然后该服务将调用金融服务、运输服务或索赔服务。缺点-每次呼叫都会导致多个呼叫。。。对但它将逻辑从您的UI应用程序中抽象出来,并为您提供了一个操作或组合来自其他服务的数据或添加适用于该应用程序的其他业务逻辑的位置。您还可以享受金融服务的好处,它仍然支持金融应用程序,而您的UI应用程序的业务需求不会妨碍您,也不会为了自身的利益而弄乱代码

我相信这有不同的解决方法。这正是我们在几个应用程序中处理的方式

编辑(回答后续问题占用了太多空间,无法发表评论)

如果您可以从传输服务获得的数据足以满足“GetCustomerDeliveries”所提出的问题,那么不,我不会将其分解到另一个包装服务。如果您需要更多数据,那么其他哪些应用程序也会从提供更多客户信息的服务中受益?这些应用程序完全依赖于交通服务吗?这是一个答案必须让你“感觉”正确的地方,因为你最了解你的系统

也许您需要打破SRP规则,让您的运输服务从财务数据库或服务获取更多客户信息。或者,如果依赖于传输服务的应用程序通常需要更多的客户数据,那么可以考虑在传输数据库中扩展客户表

如果规则、原则或哲学对你的应用程序更有意义的话,就不应该如此严格地应用,以至于你无法打破它。这将是一个平衡,没有正确或错误的答案,只是什么对这种情况更有效

你在开始这篇文章时谈到了一个新的UI应用程序,它将支持你业务中的索赔部分,并且它需要财务和运输数据(以及它自己的数据)。这是调用包装器服务的最佳候选者。它需要来自3个不同且独立的数据源的数据。您的运输服务具有有限的客户信息,这对某些应用程序很有效,但对其他应用程序可能不太有效。如果您编写了一个包装器服务,它100%反映了您的传输服务,并额外提供了更多的客户数据,那么您获得了什么?为使用它的应用程序提供更多数据,而且在向传输服务添加功能时为您提供更多维护。这个包装器还能提供什么其他价值


在这种情况下,对我来说,让交通服务部门从金融服务部门获得更多的客户数据“感觉”更好。您的传输数据库有一些数据,但不够。这几乎就像传输服务需要通过满足数据需求本身来弥补这一不足。

我应该使用WWF(或其他编排工具)的编排服务

我喜欢这种观点:

DAL、BLL、SIL-->WCf1 DAL、BLL、SIL-->WCF2

wcf1和wcf2通过业务流程服务连接在一起