有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码

本文关键字:代码 WCF 方法 有没有 一种 | 更新日期: 2023-09-27 18:01:08

我有一段可怕的代码,我一直在尝试改进,但在WCF服务上没有成功。

在服务器端,我有这个合同:

[ServiceContract]    
public interface IOhmioService
{
    [OperationContract]        
    IEnumerable<Enumerador> GetEnumerador(string sClassType);
}

这个实现(这是我试图改进的代码,尤其是那个糟糕的切换(

public IEnumerable<Enumerador> GetEnumerador(string sClassType)
    {
      
        IEnumerador _obj;
        switch (sClassType)
        {
            case "Clients":
                _obj = new Clientes();
                break;
            case "Vendors":
                _obj = new Vendedores();
                break;
            default:
                _obj = new Clientes();
                break;
        }
        return _obj.Enumerar();
       
    } 

并从客户端调用此方法,如下所示:

Clients = this.serviceClient.GetEnumerador("Clientes");

想法是这样的:我有几个类来实现这个接口:

public class Enumerador
{
    public int ID{ get; set; }
    public string Description{ get; set; }
}
public interface IEnumerador
{
    IEnumerable<Enumerador> Enumerar();
}

我想要的是客户端可以决定要枚举哪个对象。问题是我不能直接发送Type,因为它不可序列化,所以它不会传递WCF服务。

那么,我如何创建一个服务方法,让客户端决定要枚举的对象(返回的类型总是Enumerador(。我知道我不能在WCF上不指定类型就发送数据,因为SOAP不支持它,但我只需要一种方法来告诉服务器要创建哪个对象!

有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码

创建一个接口,并让所有类(即Clientes、Vendoores(实现它。然后将Interact传递给方法,而不是字符串。创建一个对象并进行编码。请找到以下代码:

public interface ISample
{
    IList<string> GetData();
}
public class Sample1 :ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Tom");
        names.Add("Peter");
        return names;
    }
}
public class Sample2 : ISample
{
    public IList<string> GetData()
    {
        IList<string> names = new List<string>();
        names.Add("Human");
        names.Add("Immortal");
        return names;
    }
}
class Program
{
    static void Main(string[] args)
    {
        var c1 = new CalledClass();
        IList<string> data = c1.GetData(new Sample2());
        foreach (var name in data)
        {
            Console.WriteLine(name);
        }
        Console.ReadLine();
    }
}

希望这能有所帮助。如果你需要更多信息,请告诉我。