我无法决定两种可能的设计选择。我有一个网站,它有一个非常广泛的业务层和DAL(网站,bll和dal都在多个单独的dll中)。我需要设计一个Windows服务,它可以获取我的一些业务对象,将它们写入文件,并将它们本地存储在我们的网络中。然后将这些文件导入第三方程序,对其进行进一步处理。
我可以通过以下两种方式设计此服务:
围绕业务层和DAL包装服务。这将是快速和简单的,但缺点是每次业务层更改时,服务都必须更新。
向网站添加网络服务,只需查询网络服务即可。 Windows服务不必使用业务层,只要Web服务没有改变,我就会很好。唯一的缺点是我可能需要创建一些基本的业务对象来解析Web服务的xml。
Windows服务必须每10-20分钟左右轮询业务层/ dal或Web服务。 Windows服务是必需的,因为该网站是在异地托管的,因此无法访问我们的任何本地资源。我倾向于选择2但我被撕裂了。
考虑到两种选择,哪种选择更好?还有其他可能的选择我没有考虑过吗?此外,您通常如何设计您拥有一组主要由网站使用的核心库但最终可能用于数据检索或执行某些功能的情况?
答案 0 :(得分:1)
我不确定将某些业务对象存储为网络上的文件的标准是什么,但如果您定期执行此操作,那么可能是您尝试跟踪某种更改,因此还有另一种解决方案:将逻辑直接构建到业务/持久层中。
如果此辅助文件存储是业务需求,那么它应该直接嵌入该层并由某种事件触发。这样,您可以只使用一个连贯的系统,而不是基本上是一个可以与系统其他部分不同步的临时后处理作业。
反转设计 - 不是围绕业务服务包装Web服务并将其用于临时报告,而是创建一个Web服务,该服务封装了从导出中接收所需的数据。定期,并在新数据准备好后让您的业务层向其发送消息。您可以异步发送消息,以免占用业务服务,并且根据您的可靠性要求,您可以设置消息队列(它比听起来更容易,WCF已经知道如何使用MSMQ作为传递机制,它只是一个要更改的配置设置很少。)
我不能肯定地说,如果不了解有关架构,数据的数量和类型,调度和报告要求等的更多信息,这比前两个选项更好,但它是你应该考虑一下。如果您认为您的业务服务可能会相当频繁地更改,那么将数据向外推送到“仓库”类型抽象而不是通过挖掘流程来实现它可能会更好。
否则,我认为我会使用选项2.我不知道您之前是否使用过WCF服务但是您应该知道您实际上不必解析XML。一切都是通过数据合同完成的,当您为Web服务生成代理时,您将获得强类型的.NET对象。如果您可以直接通过服务API传递域对象,那么创建Web服务的工作实际上很少。
Web服务的真正的缺点是,您必须采取措施确保您的服务合同永远不会发生重大变化(否则可能会破坏客户端)。因此,您最终可能最终需要在服务端创建数据传输对象以用作公共API,而不是通过域对象。但是在很多情况下你不需要长时间这么做,所以继续尝试一下,你会发现它非常简单。
答案 1 :(得分:1)
选项二的变体:
向网站添加WCF服务,公开所需的基本DTO DataContracts信息。 您可以在WCF服务中使用AutoMapper或类似功能来处理将业务对象转换为DTO的无聊位。
答案 2 :(得分:0)
为了获得更大的灵活性,而不是围绕业务和DAL进行硬件包装,而不是依赖于网站(通过集成的Web服务),可以使用以下设计概念:interface
s,{{3} },dynamic Type loading所以你的服务是一个瘦的解耦层,它与业务和DAL进行通信,允许动态更新业务和DAL,而无需重新编译服务。也许将程序集放在机器的Inversion of Control中,以便在各种其他项目程序集和应用程序之间共享。
我知道这似乎是为了它而抛弃行话,但这就是我开始思考的方式。
修改强>
动态加载类型实际上非常棒且容易。这是一种快速的C#伪代码,无需测试就可能实际上是正确的。
// Get a System.Type from string representation
Type t = Type.GetType("type name");
// Create instance of type.
object o = Activator.CreateInstance(t);
// Cast it to the interface (or actual Type) you're working with.
IMyInterface strongObject = (IMyInterface)o;
// ... and continue from there with the instance.
有关如何制定类型名称的字符串表示形式的说明,请参阅MSDN下的Global Assembly Cache,Type.AssemblyQualifiedName和类似地方。简而言之,您可以在app.config或web.config文件中看到许多程序集限定类型名称,因为它们使用相同的格式。
答案 3 :(得分:0)
从我的观点二,我明白,你只需要为这项额外服务添加web-api。因此,您必须更新两个部分以进行任何更改(extra-service,web-api,dll)。使用选项一,你只需要更新两个部分(extra-service,dll),因此我会选择一个。
但如果你的目标是一直需要维护的一般网络API,请选择第二种方式。