我可以在我的服务层中将数据整形到ViewModel中吗?

时间:2013-01-14 21:44:19

标签: asp.net-mvc architecture domain-driven-design

我有一个逻辑布局困境,但从这里开始是我的应用层:

  1. 演示文稿/ UI层(Web API或MVC,真的可以是任何东西)
  2. 服务层(此层总体上是精简的,并充当域模型和存储库层的导体)
  3. 域模型(此层不是贫血,并且在模型类中同时具有数据和行为)
  4. 存储库
  5. 目前,层设计得很好,流动也很直观。但是我需要将纯模型数据整形为几个特定的​​XML文档,以便通过.xsd模式进行验证(模型类映射1:1用于XML文档,或者我可以直接序列化对象到XML)。对我来说,模型层应该 no 理解其形状或结构超出其当前设计;这是更高层的责任。

    我的第一个想法是提供整形和逻辑,通过ViewModel类从 Service 层中的域模型数据创建这些XML文档,以便返回一个级别。我在这里使用术语'ViewModel'纯粹意味着更高层或演示的形状数据。但是,我读到的所有内容都说服务层不应该包含ViewModels:Should a service layer return view models for an MVC application?How to pass complex ViewModel to Service Layer in ASP.NET MVC?

    好的,请关注这一分钟,让我的MVC图层包含ViewModels。我有这个问题。具有服务层的完整原因是能够充当应用程序的外观或入口点,从而允许多种UI类型(WinForms,WPF,WebForms,MVC,WCF等) 。我需要 任何 UI可用的XML整形逻辑我连接到服务层。如果我把它放在MVC / UI层中,如果我连接一个新UI,它就不再存在了。

    现在我回到将XML整形类推回到服务层。我也不认为这些类应该在域层上,因为这不是业务逻辑,并且表示格式类型:XML,我不想要。最后,我不能在像基础架构层这样的垂直层中引入这种逻辑,因为现在这个层必须理解我的域模型并像行李一样随身携带。

    根据专业ASP.NET设计模式一书,使用此体系结构时会说明以下内容:“服务层的角色是作为应用程序的入口点;有时这被称为门面。服务层为表示层提供强类型视图模型,有时也称为表示模型。“我想将形状类放入我的服务层似乎是最合适的,我已经看到了这样做的例子。

    逻辑属于哪里?我想获取1..n的域模型类,使用各种数据构建XML文档,然后允许它可用于UI / Presentation层?谢谢!

1 个答案:

答案 0 :(得分:2)

恕我直言,我会说你将这些XML整形类放入服务层的本能似乎是正确的,它绝对不属于UI层,因为你需要它可用于不同类型的UI。为他们创建一个单独的图层似乎是一种矫枉过正。将它们与数据访问类放在一起似乎也不对。

我认为你应该明白你的本能。如果在某个地方,您会看到这段代码并且您认为它不合适,那么您可以将它移动到您认为合适的地方。很高兴能够事先给它一个好的想法,但我会说不要挂断它。开始编码,不时地退后一步,寻找看似不合适的东西。 重构代码是您在项目成型过程中不断做的事情!