我有以下MVC设计模式问题并且混淆了哪条路。
在UI层中,视图模型用于Controller操作方法。凉。
服务层使用请求 - 响应消息模式,因此服务类方法将Request对象作为参数(in),并且该方法返回Response对象(out)。此方法使用Domain对象参数调用Repository方法。换句话说,要调用服务方法,您需要使用您的数据填充Request对象,并且该方法返回Response对象中的结果,即请求 - 响应消息传递。
要将View Model中的数据传递给Service方法中的Domain对象,您有两个选项AFAIK:
我看到两种方法都存在缺陷......
在选项1中,如果视图模型具有许多属性,并且您正在使用映射器(例如AutoMapper),则在Controller方法中,您需要将视图模型中的属性自动化为Request对象。然后在Service层中,在service方法中,您需要将Request对象中的属性自动化为Domain对象。两级映射 - 非常错误!
在选项2中,Request对象包含一个包含View Model的属性。然后,您可以轻松高效地将Request.vm(属性)自动化为Domain对象,但由于某些原因,这对我来说看起来很糟糕!我很担心这个设计。
哪种方法最好?或者是否有另一种更好的方法来映射VM和R-R模式?
答案 0 :(得分:2)
请求/响应是消息传递模式,但看起来您没有使用消息..而是使用对象。这是你问题的真正症结所在。您错误地使用了该模式,更重要的是,您似乎正在使用错误的模式进行工作。为什么在这种情况下需要消息传递?对于简单的多层应用程序来说,这只是额外的开销。
如果您真的想使用消息传递,您应该将数据序列化为json或xml,将其传递给您的服务,然后将数据反序列化为您在该层中使用的任何对象。这样,您就不需要依赖于其他层的数据类型,因为(反)序列化过程不一定需要这样的依赖。
就个人而言,我会避免整个消息传递方面,并且有一个在您的视图模型和域对象之间映射的映射层,然后使用域对象调用您的服务层。
答案 1 :(得分:1)
我在上面描述的场景中没有Request对象。
我只是使用来自服务层的域对象(POCO类/实体) - >表示层。
在从控制器准备响应时,我使用AutoMapper将从服务层返回的Domain对象转换为ViewModel对象。
通过上述方法,正如您所看到的,选项1根本不再是问题。域到VM,反之亦然配置完成一次,你去。
当Web请求进入时,它有一个ViewModel对象,在传递给服务层之前转换回Domain模型。
我不确定你是否可以将其视为"另一个"或者"更好"图案。如果这个想法听起来不错,我可以根据需要提供更多信息。