c# WCF web服务中的枚举

本文关键字:枚举 服务 WCF web | 更新日期: 2023-09-27 18:18:49

我甚至不确定在哪里寻找我的问题的答案,你可以从我非常通用的标题中看到。

我想做的:

我有一个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并扩展它们,或者通过使用不同的类来实现这一点。

我要寻找的最终结果类似于这个问题和这个问题,但是我如何以上面显示的方式将客户ID传递到我的web服务中?

我如何在我的web服务中构建我的代码?我的要求可能实现吗?

注:请随意编辑标题和标签,以便更好地描述我的问题。

c# WCF web服务中的枚举

我建议采用稍微不同的方法。使用一个包含客户信息的类,并用[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#类一样。请注意,一般来说,数据契约不包含方法或构造函数。

参见使用数据契约

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

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

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

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

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

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

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