我需要为数据收集服务设计一个webservice --要求webservice不能直接访问数据库。
web服务将与数据收集服务对话,而数据收集服务将访问数据库。那么HTTP是web服务与数据收集服务对话的唯一选择吗?但是数据收集服务还有待开发--是否有一种设计应该遵循,以便web服务能够与该服务进行对话?我希望确保数据收集服务被正确实现,这样我就可以在没有太多麻烦的情况下完成我那部分的web服务。
发布于 2014-06-03 03:41:17
在这种情况下,可以将"web服务“看作是任何应用程序。毕竟,访问“数据收集服务”的代码应该可以在任何应用程序中运行。
“数据收集服务”是应用程序的外部依赖项。因此,应该将其抽象到服务外观后面。例如,一个接口。(我将在我的示例中使用C#,因为我最熟悉它。)如下所示:
public interface IDataCollectionService
{
void CollectData(SomeDataDTO data);
}此时,所有使用数据收集服务的代码都应该使用此接口类型。在开发数据收集服务之前,您可以使用模拟数据收集服务。任何内存中的实现只要有足够的功能让你继续工作就可以了。例如:
public class MockDataCollectionService : IDataCollectionService
{
public void CollectData(SomeDataDTO data)
{
// do nothing
}
}这种实现不会有副作用,不会抛出错误,只是假设外部依赖中的所有内容都按预期工作。您可以编辑/扩展此mock以产生错误条件等。
(请注意,我使用单词"mock“是一种比纯粹的单元测试术语更通用的方式。事实上,这种情况在行业中经常发生。对于您的单元测试本身,您可以使用上面的接口使用任何模拟库来创建实际的单元测试模拟。)
这只是一个例子,如何构建它完全取决于您。重点在于,作为外部依赖项,与数据收集服务的所有交互都在外观后面。然后,当开发该服务时,它使用什么协议和标准就不再重要了。当您创建实现该接口的新DataCollectionService类时,使用这些协议和标准的所有代码都将封装在该类中。项目的其余部分不会知道或关心其中的区别。
然后,当该实现准备就绪时,您可以将其替换为“模拟”实现并测试系统,而无需更改应用程序中的任何其他代码。如果以后决定再次更改协议,那么您唯一需要更改(或创建一个新的)的就是实现接口的类。
实际上,如果您曾经被授予访问数据库的权限,那么所有需要更改的就是再次构建该接口的新实现。从本质上讲,您是否可以访问数据库与使用什么协议一样无关紧要。软件的体系结构对其进行了抽象,因此基础设施的体系结构的影响尽可能小。
发布于 2014-06-03 03:33:38
您可以创建模拟数据收集服务的模拟对象,直到实际的服务完成为止。在创建单元测试时,mock对象可以兼做测试工具。
https://stackoverflow.com/questions/24001865
复制相似问题