您可以通过多种方式来构建它,这些方式都遵守SRP(单一责任原则)。
一种方法如下:有一个接口,IReportLoadingService
,带有一个接收报告标识符并返回IReport
实例的方法。
这个的实现IReportLoadingService
可以有IReportDefinitionRetrievalService
一个依赖,例如
public class ReportLoadingService : IReportLoadingService
{
private readonly IReportDefinitionRetrievalService _definitionService;
public ReportLoadingService(IReportDefinitionRetrievalService definitionService)
{
_definitionService = definitionService;
}
public IReport GetReport(string reportName)
{
var reportDefinition = definitionService.GetDefinition(reportName);
return GenerateReportFromDefinition(reportDefinition);
}
private IReport GenerateReportFromDefinition(string definition)
{
// Logic to construct an IReport implementation
}
}
的实时实现IReportDefinitionRetrievalService
将访问数据库并返回 XML。现在您ReportLoadingService
负责填充IReport
实例,而另一个服务负责实际获取报表定义。
对于单元测试,您可以创建一个 MockIReportDefinitionRetrievalService
来做任何您想做的事情(例如在字典中查找定义)。查看Moq以获得良好的模拟框架。它将允许您执行以下操作:
[Test]
public void GetReportUsesDefinitionService()
{
var mockDefinitionService = new Mock<IReportDefinitionRetrievalService>();
mockDefinitionService.Setup(s => s.GetDefinition("MyReportName")).Returns("MyReportDefinition");
var loadingService = new ReportLoadingService(mockDefinitionService.Object);
var reportInstance = loadingService.GetReport("MyReportName");
// Check reportInstance for fields etc
// Check the definition service was used to load the definition
mockDefinitionService.Verify(s => s.GetDefinition("MyReportName"), Times.Once());
}