2010-06-02 74 views
2

我可能在这里有错误的“模式”,但我认为这是一个公平的话题。关于编写“灵活”API的想法?

我有一个ASP.Net MVC应用程序中调用了一个WCF服务要回将要呈现的ViewModels。 (它使用WCF服务的原因是其他小型MVC应用程序也可能只会在内部调用这些ViewModel,这不是一个公共可用的东西,所以我可以改变服务的任何一端。这个想法是移动该网站中的逻辑更靠近服务器/数据库,因此往返并不那么昂贵 - 并且仅从Web服务器到数据库服务器进行一次往返。

我试图找出最好的东西从服务返回这些“的ViewModels”。有许多常用的功能,但每个页面可能都希望显示这些东西的不同子集(所以主页可能是表格列表,下一页,可用的表格列表和用户列表)。

那么,什么是该网页希望,希望不web服务寂寂页面返回信息的最佳方式?

编辑:

它已经在下面推荐了我移动的逻辑过程。这将会快得多,除了那是我们正在离开的地方,因为它实际上慢了很多(在这种情况下)。原因是数据库在一台服务器上,而webapp在另一台服务器上,而webapp在点上特别健谈(有些页面最终可能会做2K次往返 - 我无法控制减少这个那么建议使用这个数字)),所以将逻辑移到更接近数据库是使其性能更高的下一个最好的方法。

回答

1

我想看看创造每每个MVC应用程序/视图中的视图模型。该服务可以从逻辑意义上返回“视图”的最大数据量,并且每个MVC应用程序在为视图组合ViewModel时使用它想要的信息。

你的服务则只有一件事负责,返回特定视图的功能数据。每个应用程序的控制器负责使用/不使用返回的数据。

这会更灵活,因为您的ViewModels可能也需要不同的验证规则。 ViewModels也具有MVC特定的需求(SelectList等),它不应该真正由服务层返回。似乎可以一眼就分享一些东西,但通常会有很多细微的差异,导致共享ViewModel是一个糟糕的主意。

class MyServiceViewResult 
{  
    public int SomethingEveryViewNeeds { get; set; } 
    public bool OnlyOneViewMightNeedThis { get; set; } 
} 

class ViewModel1 
{ 
    public int IdProperty { get; set; } 

    public ViewModel1(MyServiceViewResult result) 
    { 
     IdProperty = result.SomethingEveryViewNeeds; 
    } 
} 

class ViewModel2 
{ 
    public int IdProperty { get; set; } 
    public bool IsAllowed { get; set; } 

    public ViewModel2(MyServiceViewResult result) 
    { 
     IdProperty = result.SomethingEveryViewNeeds; 
     IsAllowed = result.OnlyOneViewMightNeedThis; 
    } 
} 
0

而不是有一个Web服务,你为什么不实施服务作为可重复使用的库封装所需的功能?

这也将让您使用多态性来实现自定义。 WCF不支持多态以灵活的方式...

使用一个进程内的服务也将是快了很多。

一个多态的解决方案的轮廓见此相关的问题:Is this a typical use case for IOC?

+0

是的,那*会快得多,除了那是我们正在离开的东西,因为它慢得多。原因是数据库在一台服务器上,而webapp在另一台服务器上,而webapp在点上特别健谈(有些页面最终可能会做2K次往返 - 我无法控制减少这个那么建议使用这个数字)),所以将逻辑移到更接近数据库是使其性能更高的下一个最好的方法。 – Paul 2010-06-02 08:57:50

+0

除非您的支持数据更改频率很高,否则您也可以使用缓存与一个进程内服务结合解决该问题(perf)......显然,我不知道您的方案的确切详细信息,因此这可能不适用于您的情况,但在一般情况下,我宁愿通过Web服务。 – 2010-06-02 09:14:11

+0

这听起来非常理想,遗憾的是在这种情况下不可能。 Web服务(或其他某种服务)确实是我们能想到的最好的方式,它经过了相当仔细的考虑 – Paul 2010-06-02 10:07:23