是否有一种不太可怕的方式来编写仍与WCF兼容的代码?

时间:2014-04-30 23:12:01

标签: c# wcf

我得到了这个可怕的代码,我一直试图通过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();

    } 

从cliente这样调用这个方法:

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不支持它,但我只需要一种方法告诉服务器创建对象!谢谢!

1 个答案:

答案 0 :(得分:1)

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

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();
    }
}

希望这会有所帮助。如果您需要更多信息,请与我们联系。