2010-11-30 144 views
1

我使用ASP .NET MVC2创建数据驱动的网站。功能请求的一部分也是创建可重用的Web服务,以公开使用哪些最终用户可以创建混搭的一些数据和业务逻辑。我们组织内部和外部会有大量用户使用它。ASP.NET中的Web服务MVC2

到目前为止,我已经构建了与数据库通信的应用程序(使用实体框架ORM),处理和显示数据(使用模型视图视图模型模式)。这部分对于网站部分来说很简单。

至于webservices部分,我正在研究使用WCF创建Web服务。我应该创建WCF数据服务作为一个单独的项目。我猜测我应该能够重用控制器中的一些代码。

在网站部分我应该调用这些Web服务并将它们用作模型?任何最佳实践?

作为somoeone新的asp.net,任何指针正确的方向将不胜感激。

+0

是否有任何特定的原因需要创建一个WCF服务,并且不能仅仅通过返回`JsonResult`作为视图输出来使用MVC作为你的web服务? – KallDrexx 2010-11-30 17:56:40

+0

@KallDrexx:缺乏灵活性是一个原因。 – 2010-11-30 19:36:56

回答

2

您可以使用单独的Web应用程序来托管Web服务。这将使您可以将您的MVC应用程序和WCF服务托管在IIS中的独立虚拟目录中。一旦你写的Web服务,你可以生成客户端代理,然后在客户端应用程序,你可以使用存储库:

public interface IProductsRepository 
{ 
    IEnumerable<Person> GetProducts(); 
} 

,然后有一个具体的实现这个仓库将从WCF服务获取的数据:

public class ProductsRepositoryWcf 
{ 
    public IEnumerable<Person> GetProducts() 
    { 
     using (var client = new YourWebServiceClient()) 
     { 
      // call the web service method 
      return client.GetProducts(); 
     } 
    } 
} 

最后注入这个仓库到你的控制器的构造函数可能是这样的:

public class HomeController: Controller 
{ 
    private readonly IProductsRepository _repository; 
    public HomeController(IProductsRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var products = _repository.GetProducts(); 
     // TODO: An intermediary step might be necessary to convert the Product 
     // model coming from the web service to a view model which is adapted 
     // to the given view 
     return View(products); 
    } 
} 

正如你所看到的现在控制器被数据取出的方式完全解耦。所有它关心的是它尊重给定的合同(IProductsRepository接口)。使用您最喜爱的DI框架,您可以轻松切换实施。顺便说一句,如果你的代码与我的相似,那么你应该在当前的MVC应用程序中改变的唯一的事情是将模型和数据访问层外部化到单独的WCF服务项目中,您将添加服务引用,实现ProductsRepositoryWcf存储库并指示您的DI框架使用此实现,而不是现在转到Web服务的ProductsRepositorySql