有没有一种不那么可怕的方法来编写仍然与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不支持它,但我只需要一种方法来告诉服务器要创建哪个对象!
创建一个接口,并让所有类(即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();
}
}
希望这能有所帮助。如果你需要更多信息,请告诉我。