【问题标题】:ASP.NET MVC consuming WCFASP.NET MVC 使用 WCF
【发布时间】:2010-12-22 19:05:23
【问题描述】:

我的 ASP.NET MVC 2 控制器目前正在通过传递由 Castle Windsor 实例化的存储库实例在其构造函数中实例化服务对象。在将存储库的 Moq 实例传递给控制器​​的构造函数后,我有调用控制器操作的单元测试。

我想允许第三方 UI 通过 WCF 访问这些服务对象。

我突然想到,将现有的服务层转换为 Web 服务,甚至在 UI 和现有的服务层之间添加一个新的 Web 服务层都会破坏我的单元测试,除非我找到一种方法来弥补这一差距。

我试图制定一个解决方案,其中我的 UI 针对服务层的接口进行编码(它已经是),我可以使用 DI 在运行时传递 Web 服务实现并在单元期间传递现有实现测试。 Web 服务实现将简单地调用现有实现。

问题:

  1. 这种方法是否可取/可行?
  2. 教程或开源项目中是否有这方面的示例?

编辑:

感谢以下建议,我相信我现在有了一个可行的解决方案。我创建了一个 WCF 服务应用程序,它使用我的域模型中的现有服务接口。 WCF 实现是一个类,其中构造函数从NinjectWCF 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


    【解决方案1】:

    您能否更详细地解释一下为什么您的测试会失败?

    我一直在做这种类型的开发。作为类的服务 => 作为 WCF 服务的服务。

    您的测试不应中断。 WCF 服务几乎是 100% 的契约,底层业务代码和逻辑不必更改。

    【讨论】:

    • 我认为这不可行,但我会试一试,看看它是如何工作的。您是否确实托管 WCF 服务并针对托管服务运行单元测试?
    • 不,我只是针对对象实例 new MayosService() 运行它。
    • 它只是点击...它只是一个实现接口的类。
    • 这里的所有答案都很有帮助——我只是认为你的答案对我的方法影响最大。谢谢!
    【解决方案2】:

    查看由 Patterns & Practices 团队创建的Web Services Software Factory。这是将您的服务构建为合同项目(数据、消息、服务)和“业务代码”的好方法。一旦你更好地理解了如何构建你的代码,你就可以将它们的风格重构为更适合你的东西。他们的示例倾向于将所有内容分成许多 VS 项目,这对于大多数商店来说可能有点矫枉过正。例如,我没有看到很多商店在项目之间共享数据合同。是的,在一个完美的世界中,您可能应该在项目之间共享很多操作系统类型(如地址),但我不经常看到它这样做。所以,我倾向于将我所有的合同内容放在一个 VS 项目中。

    【讨论】:

      【解决方案3】:

      如果您的服务已经被定义为接口,那么您就有了先机。

      将服务作为构造函数依赖项而不是存储库传递给控制器​​。让您的 DI 容器 A) 为服务提供存储库,B) 为控制器提供服务。

      如果您想将您的服务层设置为 wcf 服务以供其他应用程序访问,您将需要使用 wcf 服务工厂将具体的服务实现从您的 DI 容器中提取出来。 Here's an example with windsor,应该很容易适应你使用的任何容器。

      此时您可以将您的网站修改为 A) 继续直接调用服务,或 B) 让它们使用服务客户端回调 Web 服务。这两种方法各有利弊。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 2011-08-10
        • 2011-08-14
        • 1970-01-01
        相关资源
        最近更新 更多