我想对我目前的设计提供一些帮助。我有一个WCF服务,WCF服务背后是服务层(http://martinfowler.com/eaaCatalog/serviceLayer.html)和存储库层。
因此客户端调用WCF服务层,WCF服务层(充当服务层)调用存储库层。
存储库层返回代表数据库的MODELS(Poco)。那么服务层我认为我需要将POCOS转换为DTO以通过线路传输?或者我应该把这些作为POCO?
一旦我在服务层上有了我的给定对象,我将其返回给客户端(ASP.NET MVC),其控制器负责将WCF服务返回的对象映射到VIEWMODEL。
我想知道我这样做是正确的,即WCF服务后面的服务层和存储库层?
负责从WCF服务返回的实际模型中创建ViewModel的控制器。
此外,我想知道是否真的有必要从存储库将从WCF服务返回的DTO转换为真实模型。
任何帮助真的很感激
答案 0 :(得分:5)
就你的WCF服务而言,一切看起来都很好。您有模型,存储库层来访问数据,您将这些模型返回给客户端。你是否应该使用DTO是值得商榷的。如果您有POCO(不是一些ORM依赖对象),您应该没问题。虽然有些情况下可能需要DTO:例如,圆形对象图可以通过ORM进行管理,但无法通过线路进行序列化(以可互操作的方式)。
现在到客户端部分:您使用WCF的事实应该是一个实现细节。因此,在您的ASP.NET MVC应用程序中,您将拥有一个存储库,使用您在svcutil.exe
编辑服务时导入的POCO,然后使用此存储库的实现来执行对服务的实际调用(可能使用ServiceClient自动生成类)。然后你的控制器应该使用抽象存储库并配置DI框架以注入实际的实现。当控制器操作调用某个存储库方法时,它会获得一个POCO,然后通过处理映射层(AutoMapper?)将其转换为传递给视图的特定视图模型。反过来说:控制器动作从视图中获取视图模型作为动作参数,使用映射层将其映射回POCO,POCO将传递给存储库,该存储库将负责使用此模型执行所需任务(在您的情况下以及将其传递给某个远程WCF服务的特定实现)。