2012-07-06 93 views
0

我正在编写我的第一个MVC应用程序,尽管我一直在尝试应用其他答案中给出的指导原则,但项目结构使这变得困难(而且我正在搞一堆东西!)。 目前,应用程序被分成以下层:具有Web API业务层的ASP.Net MVC 3体系结构

  • 域对象/逻辑使用Web服务的API访问。我将此图层视为黑盒,因为某些代码在几个WPF应用程序中使用,并且不在我的控制之下。

  • 存储库层。该层调用Web API服务,并添加到帮助单元测试。它调用服务并返回一个反序列化的域模型。

  • 控制器。根据数据的使用方式,我有两种不同的控制器。

    在第一种类型中,控制器调用存储库中的方法,然后使用映射器类将域对象转换为视图模型。映射是手动完成的,因为一些视图模型与底层域对象显着不同。例如:

    DomainObject domainObject = m_repository.GetObject(id); 
    ViewModel model = ModelMapper.PopulateViewModel(domainObject); 
    return View(model); 
    

    第二种类型旨在提供AJAX调用所使用的数据。在这里,控制器像以前一样调用存储库,但随后使用定制的Json.Net转换器将域模型转换为JSON。 E.g:

    var jsonNetResult = new JsonNetResult(); 
    DataObject data = m_repository.GetData(id); 
    
    jsonNetResult.Converters.Add(new DataObjectConverter()); 
    jsonNetResult.Data = data; 
    
    return jsonNetResult; 
    

问题:

这感觉就像我做了很多的JSON,域对象和视图模型之间的切换。这似乎没有特别的表现 - 可以/应该存储库创建视图模型而不是控制器?

如果数据旨在作为JSON提供,我将域对象转换为JSON,而不是使用视图模型。这看起来不一致,但我不想为了它而映射到视图模型。这是正确的方法吗?

我可以在实体框架的顶部找到很多使用MVC的示例,但我很努力地找到在MVC应用程序中使用Web API的示例。任何人都可以将我指向正确的方向吗?

希望这是有道理的,谢谢!

回答

2

我会为您的应用程序建议一个更简单的模型:将Web API和经典的MVC控制器视为存储库层反映持久存储的仓库信息的两种方式。你不想让MVC控制器调用Web API - 直接进入存储库。

有很多关于如何在MVC应用程序中使用Web API的例子,例如你可以看看[1]。

的Henrik

[1] http://www.asp.net/web-api/samples

+0

我有看那些示例,并且可以看到它们是如何使用Web API和控制器层。但是,Web API层提供了视图所需的内容(与控制器的方式相同),而在编写Web API层的项目中,提供了访问不能密切反映视图结构的业务模型。 我在控制器和Web API之间有一个存储库层的原因更多的是帮助我测试,而不是其他任何东西 - 可能这是命名错误。 – Nemone 2012-07-10 07:03:48