【问题标题】:enums in a c# WCF web servicec# WCF Web 服务中的枚举
【发布时间】:2014-08-19 22:58:35
【问题描述】:

从我非常笼统的标题中可以看出,我什至不确定在哪里可以找到我的问题的答案。

我想做的事:

我有一个从数据库中提取数据的 WCF Web 服务,它的名称是 svcService。我将在另一个程序中使用它:

IsvcService data = new IsvcService ();

我希望能够通过仅传递客户 ID 来从该服务中提取各种客户信息,并且我希望访问数据的方式如下:

data.Customer("MYCUST").Name (returns customer's name)

data.Customer("MYCUST").Address.City (returns customer's city)

data.Customer("MyCUST").Contact.EmailAddress (returns customer's email address)

我尝试了什么:

我还是个 C# 新手,所以我什至不太确定该去哪里看,但我想也许我可以通过使用 Enums 并扩展它们,或者使用不同的类来实现这一点。

我正在寻找的最终结果类似于this questionthis question,但是如何按照上面显示的方式将客户 ID 传递到我的网络服务中?

如何在我的网络服务中构建我的代码?我问的可能吗?

附:随意编辑标题和标签以更好地描述我的要求。

【问题讨论】:

  • 不清楚你在问什么。我看不出枚举在这里是如何发挥作用的。您计划在哪些信息上使用枚举?
  • “好吧,你不能”。您为什么要尝试重新定义 Web 服务的工作方式?

标签: c# web-services wcf class enums


【解决方案1】:

我会建议一种稍微不同的方法。使用包含客户信息的类并使用[DataContract] 属性对其进行修饰。您可以将客户对象返回给您的客户,然后客户可以访问该对象中的属性以获取相关数据。

例如,你可以有一个这样的类:

[DataContract(Namespace = "http://namespacename/")]
public class Customer
{

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public CustomerAddress { get; set; }

    [DataMember]
    public CustomerContact { get; set; }

    // Other properties as desired/needed\
}

有几点需要指出。首先,它看起来像大多数其他类(只有一个除了属性之外什么都没有),但是该类用[DataContract] 属性装饰,每个属性都用[DataMember] 属性装饰。只有用 [DataMember] 属性修饰的属性才会被 DataContractSerializer 序列化。

其次,您可以在数据协定中包含嵌套类 - 请注意 CustomerAddressCustomerContact 属性。这两者也都是数据合同。

例如:

[DataContract(Namespace = "http://namespacename/")]
public class CustomerAddress
{

    [DataMember]
    public string City { get; set; }

    // other properties
}

那么在你的服务中你可以有一个获取客户信息的方法,例如:

public Customer GetCustomerInfo(string customerID)
{

    // Code to get customer data, populate CustomerInformation and return it.
}

在你的客户中,你会这样做:

MyServiceClient client = new MyServiceClient();

Customer customerInfo = client.GetCustomerInfo("12345");

然后,客户端将访问数据的各个部分,就像访问具有属性的任何其他类实例一样:

string name = customerInfo.Name;
string city = customerInfo.Address.City;
string phone = customerInfo.Contact.EmailAddress;

这里不需要使用枚举,只需使用代理从您的服务返回的对象,就像使用任何其他 C# 类一样。请注意,一般而言,数据协定不包含方法或构造函数。

另见Using Data Contracts

最后一点,您的服务应该实现接口,这就是构建客户端的基础,而不是接口 - 换句话说,IsvcService data = new IsvcService(); 应该看起来像 svcService data = new svcService();,其中svcService 实现了合约在接口IsvcService

【讨论】:

    【解决方案2】:

    您将像对待任何其他类一样对待您的 WCF Web 服务...您将为它创建一个代理对象,然后在其上调用方法。例如:

    var proxy = // you'll instantiate your proxy client here
    proxy.CallFirstMethod();
    proxy.CallSecondMethod("this takes a string");
    // and so on.
    

    WCF 中的Enums 被视为正常,但您需要在模型中声明它们(就像任何其他数据类型一样),以便 WCF 知道如何处理它们。

    看起来,你不需要Enums,你想用一些参数调用服务上的方法。

    为了完整起见,下面是定义 Enum 以便 WCF 可以使用它的方法

    [DataContract(Name = "MyFancyEnum")]
    public enum FancyEnum
    {
        [EnumMember]
        Unicorn,
        [EnumMember]
        Ogre,
        [EnumMember]
        Banana
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多