我的ASP.NET MVC 2控制器当前通过传递由Castle Windsor实例化的存储库实例在其构造函数中实例化服务对象。我有单元测试,在将存储库的Moq实例传递给控制器的构造函数后调用控制器动作。ASP.NET MVC消费WCF
我想允许第三方UI通过WCF访问这些服务对象。
我发现把我现有的服务层转换成Web服务,甚至在UI和现有服务层之间添加一个新的Web服务层将会破坏我的单元测试,除非我找到弥合这种差距的方法。
我试图找出一个解决方案,其中我的UI是根据服务层的接口进行编码的(现在已经是这样),我可以使用DI在运行时传递Web服务实现,并在现有实现期间传递单元测试。 Web服务实现只需调用现有的实现。
问题:
- 是这样的做法可取/可能吗?
- 在教程或开源项目中是否有这样的例子?
编辑:
我相信我有一个可行的解决方案现在多亏了下面的建议。我创建了一个WCF服务应用程序,它使用我的域模型中的现有服务接口。 WCF实现是一个类,构造函数从Ninject的WCF extension获取存储库实例,并从域模型创建服务实例。 WCF中的每个方法/函数都只是从现有的服务层调用相同的方法/函数。
有一些注意事项。例如,当我在控制器中创建服务时(实际上,我使用Ninject创建WCF服务的实例并将其提供给控制器的构造函数),我无法再传递对ASP.NET MVC ModelState的引用。原因在于WCF是一个消息传递平台 - 每次调用都必须明确传达更改(即,我的验证错误现在作为各个函数/方法的参考参数传回)。
我还必须添加一些序列化/ servicemodel引用到我以前的POCO Core项目。
另外,我从Castle转换到Ninject,因为Castle's WCF solution的成熟度很低,我当时并不习惯使用它。
我认为这是不可行的,但我会给它一个镜头,看看它是如何工作的。你真的托管你的WCF服务,并针对托管服务运行你的单元测试吗? – Mayo 2010-12-22 20:00:29