【发布时间】:2010-12-22 19:05:23
【问题描述】:
我的 ASP.NET MVC 2 控制器目前正在通过传递由 Castle Windsor 实例化的存储库实例在其构造函数中实例化服务对象。在将存储库的 Moq 实例传递给控制器的构造函数后,我有调用控制器操作的单元测试。
我想允许第三方 UI 通过 WCF 访问这些服务对象。
我突然想到,将现有的服务层转换为 Web 服务,甚至在 UI 和现有的服务层之间添加一个新的 Web 服务层都会破坏我的单元测试,除非我找到一种方法来弥补这一差距。
我试图制定一个解决方案,其中我的 UI 针对服务层的接口进行编码(它已经是),我可以使用 DI 在运行时传递 Web 服务实现并在单元期间传递现有实现测试。 Web 服务实现将简单地调用现有实现。
问题:
- 这种方法是否可取/可行?
- 教程或开源项目中是否有这方面的示例?
编辑:
感谢以下建议,我相信我现在有了一个可行的解决方案。我创建了一个 WCF 服务应用程序,它使用我的域模型中的现有服务接口。 WCF 实现是一个类,其中构造函数从Ninject 的WCF extension 获取存储库实例,并从域模型创建服务实例。 WCF 中的每个方法/函数只是从现有服务层调用相同的方法/函数。
有一些警告。例如,当我在控制器中创建服务时,我不能再传递对我的 ASP.NET MVC ModelState 的引用(实际上,我使用 Ninject 创建 WCF 服务的实例并将其提供给控制器的构造函数)。原因是 WCF 是一个消息传递平台 - 必须在每次调用时明确传达更改(即,我的验证错误现在作为单个函数/方法的参考参数传达回来)。
我还必须向我以前的 POCO Core 项目添加一些序列化/服务模型引用。
另外,我从 Castle 切换到了 Ninject,因为 Castle's WCF solution 的成熟度级别较低,此时我不习惯使用它。
【问题讨论】:
标签: asp.net-mvc wcf unit-testing dependency-injection repository