asp.net - ASP .NET MVC2 中的 Web 服务

标签 asp.net asp.net-mvc web-services asp.net-mvc-2 mvvm

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

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

至于网络服务部分,我正在研究使用 WCF 来创建网络服务。我是否应该将 WCF 数据服务创建为单独的项目。我猜我应该能够重用 Controller 中的一些代码。

在网站部分我应该调用这些网络服务并将它们用作模型吗?有什么最佳实践吗?

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

最佳答案

您可以使用单独的 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();
        }
    }
}

最后将此存储库注入(inject)到 Controller 的构造函数中,如下所示:
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);
    }
}

正如您现在所看到的, Controller 通过获取数据的方式完全解耦。它所关心的是它尊重给定的契约(Contract)(IProductsRepository 接口(interface))。使用您最喜欢的 DI 框架,您可以轻松切换实现。

顺便说一句,如果您的代码类似于我的代码,那么您应该在当前 MVC 应用程序中更改的唯一一件事是将模型和数据访问层外部化到一个单独的 WCF 服务项目中,您将向该项目添加服务引用,实现 ProductsRepositoryWcf存储库并指示您的 DI 框架使用此实现而不是 ProductsRepositorySql现在将转到 Web 服务。

关于asp.net - ASP .NET MVC2 中的 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4316625/

相关文章:

css - 无法在 MVC 表单中添加 CSS 样式

asp.net-mvc - ASP.NET MVC 路由的性能

java - Java代码无法访问Web Service,但在Chrome中可以正常看到其wsdl

asp.net - 如何在服务器上处理某些内容时更新状态标签?

javascript - Asp.net 页面在 Internet Explorer 7 和 7+ 版本中加载奇怪的内容

jQuery DataTables 使用 MVC 显示和隐藏详细信息功能

java - 找不到媒体类型=应用程序/xml 的 MessageBodyWriter

java - 不用 Maven 构建动态 Web 项目

c# - 检查用户名是否已注册

javascript - 在哪里存储访问和刷新 token