Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用WCF的ASP.NET MVC_Asp.net Mvc_Wcf_Unit Testing_Dependency Injection_Repository - Fatal编程技术网

Asp.net mvc 使用WCF的ASP.NET MVC

Asp.net mvc 使用WCF的ASP.NET MVC,asp.net-mvc,wcf,unit-testing,dependency-injection,repository,Asp.net Mvc,Wcf,Unit Testing,Dependency Injection,Repository,我的ASP.NET MVC 2控制器当前正在通过传递Castle Windsor实例化的存储库实例在其构造函数中实例化服务对象。我有一些单元测试,它们在将存储库的Moq实例传递给控制器的构造函数之后调用控制器操作 我希望允许第三方UI通过WCF访问这些服务对象 我突然想到,将现有服务层转换为Web服务,甚至在UI和现有服务层之间添加一个新的Web服务层,都会破坏我的单元测试,除非我找到弥合这一差距的方法 我试图找到一个解决方案,在这个解决方案中,我的UI是根据服务层的接口编码的(它已经是了),我

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

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

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

我试图找到一个解决方案,在这个解决方案中,我的UI是根据服务层的接口编码的(它已经是了),我可以使用DI在运行时通过Web服务实现,并在单元测试期间通过现有实现。Web服务实现将只调用现有的实现

问题:

  • 这种方法是否可取/可行
  • 在教程或开源项目中有这样的例子吗
  • 编辑:

    由于下面的建议,我相信我现在有了一个可行的解决方案。我创建了一个WCF服务应用程序,它使用我的域模型中的现有服务接口。WCF实现是一个类,构造函数从的中获取存储库实例,并从域模型创建服务实例。WCF中的每个方法/函数只是从现有服务层调用相同的方法/函数

    有一些警告。例如,在控制器中创建服务时,我无法再传递对ASP.NET MVC ModelState的引用(实际上,我使用Ninject创建WCF服务的实例并将其提供给控制器的构造函数)。原因是WCF是一个消息传递平台-更改必须在每次调用时显式传回(即,我的验证错误现在作为单个函数/方法的参考参数传回)

    我还必须向以前的POCO核心项目添加一些序列化/服务模型引用


    另外,我从Castle切换到Ninject,因为它的成熟度级别较低,我现在不习惯使用它。

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

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


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

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

    如果您的服务已经定义为接口,那么您就有了一个良好的开端

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

    如果希望将服务层作为wcf服务供其他应用程序访问,则需要使用wcf服务工厂从DI容器中提取具体的服务实现,它应该很容易适应您使用的任何容器


    此时,您可以修改您的网站,以A)继续直接调用服务,或B)让他们使用服务客户端回调web服务。这两种方法都有优点和缺点。

    我认为这是不可行的,但我会尝试一下,看看它是如何工作的。你真的托管了WCF服务并对托管的服务运行了单元测试吗?不,我只是对对象实例
    new MayosService()
    运行了它。它只是单击。。。这只是一个实现接口的类。这里的所有答案都很有帮助——我认为你的答案对我的方法影响最大。谢谢