1

我的项目分为服务层项目和实施层项目。两者都是使用 Visual Studio 2010 用 C# 编写的。服务层接受请求对象并将其传递给实现层。实现层操作此对象并将其传递给外部 Web 服务。然后,外部 Web 服务的结果通过实现和服务层传递回客户端。

每一层都使用相同的请求和响应对象。

有没有办法可以跨两个层使用共享引用,并使用相同的引用与外部 Web 服务进行通信?如果没有,最整洁的方法是什么?

我宁愿避免必须维护项目特定的服务引用,而是使用单个数据合同 dll。但是,当我使用这种方法时,我发现在与外部 Web 服务方法进行通信时,我需要使用 Webservice.Request 而不是 DataContract.Request。

4

2 回答 2

1

一种方法是创建一个由您的服务层和实现层共享的模型。当您收到来自 Web 服务的响应时,您可以将该对象转换为您自己的模型并传递它。当您需要通过 Web 服务更新数据时,请将您的模型转换回 Web 服务请求的模型。

您可以创建一个类,如:

public class MyCustomModel
{
    public int Id { get; set; }
    public string SomeValue { get; set; }
    // etc.
}

然后您可以创建从 WS 转换为您的自定义模型的扩展方法

public static class MyExtensions
{
    public static MyCustomModel ConvertToMyCustomModel(this MyCustomModel model, WebServiceModel wsModel)
    {
        var newModel = new MyCustomModel { Id = wsModel.Id, SomeValue = wsModel.SomeValue };

        return newModel;
    }
}

可以使用相同的方法将 MyCustomModel 转换为 WebServiceModel。这样,如果您更改 Web 服务或者它指向另一个位置,您可以轻松地只更新一个位置,而不是同时更改服务和实现层。

于 2013-05-24T09:34:53.463 回答
0

不确定如何为您的服务创建代理。

以下步骤适用于使用 Visual Studio“添加服务引用”功能。

  1. 将您的合同转移到专门的项目。仅存储联系人而不在那里实施。
  2. 为服务和客户项目添加对合同项目的引用。
  3. 使用 Contracts 中的合约在 Service 中实现服务并运行服务。
  4. 在服务项目中添加服务引用。确保“在所有引用的程序集中重用类型”是厚脸皮。

因此,您应该在整个解决方案中使用 Contracts 项目中定义的类。

第 2 步在这里很关键。客户端需要引用 Contracts.dll 否则它不知道这些类型并将生成基于 WSDL 的新类型。

于 2013-05-24T19:15:59.830 回答