C# 有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码?
我有这个可怕的代码,我一直在努力改进,但没有成功的WCF服务 在服务器端,我有此合同:C# 有没有一种不那么可怕的方法来编写仍然与WCF兼容的代码?,c#,wcf,C#,Wcf,我有这个可怕的代码,我一直在努力改进,但没有成功的WCF服务 在服务器端,我有此合同: [ServiceContract] public interface IOhmioService { [OperationContract] IEnumerable<Enumerador> GetEnumerador(string sClassType); } 想法是这样的:我有几个类在其中实现这个接口: public class Enumerador {
[ServiceContract]
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(string sClassType);
}
想法是这样的:我有几个类在其中实现这个接口:
public class Enumerador
{
public int ID{ get; set; }
public string Description{ get; set; }
}
public interface IEnumerador
{
IEnumerable<Enumerador> Enumerar();
}
公共类枚举器
{
公共int ID{get;set;}
公共字符串说明{get;set;}
}
公共接口IEnumerador
{
IEnumerable枚举器();
}
我想要的是,客户机可以决定要枚举哪个对象。问题是我不能直接发送类型,因为它不可序列化,所以它不会通过WCF服务
因此,如何创建一个服务方法,客户机可以在其中决定要枚举的对象(返回的类型始终为Enumerador)。我知道如果不在WCF上指定类型,我就无法发送数据,因为SOAP不支持它,但我只需要一种方法来告诉服务器要创建哪个对象 创建一个接口,并让所有类(即客户、供应商)实现它。然后将接口传递给方法,而不是字符串。然后创建一个对象并进行编码。请查找以下代码:
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();
}
}
公共接口很简单
{
IList GetData();
}
公共类示例1:ISample
{
公共IList GetData()
{
IList names=新列表();
姓名。加上(“汤姆”);
姓名。添加(“彼得”);
返回姓名;
}
}
公共类样本2:ISample
{
公共IList GetData()
{
IList names=新列表();
名称。添加(“人类”);
名称。添加(“不朽”);
返回姓名;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var c1=新调用的类();
IList data=c1.GetData(new Sample2());
foreach(数据中的变量名称)
{
Console.WriteLine(名称);
}
Console.ReadLine();
}
}
希望这有帮助。如果您需要更多信息,请告诉我。从可用性的角度来看,我确实认为通过web服务API公开GetClientes()和GetVendedores()的单独方法可以让事情变得更加清晰和用户友好,而不是调用一个传递调用方所需字符串的方法。您仍然可以让这些单独方法的实现调用一个泛型方法来返回IEnumerable,并让客户机和供应商从Enumerador派生以保持服务器端的整洁。既然方法“GetEnumerador”的目的只是创建类的新对象,为什么我们不能将其放在客户端?谢谢@yyou。这只是因为客户机对数据库对象和实现Enumerador的类一无所知,Enumerador是从数据层的实体框架派生的。感谢您花时间@不朽。实际上,我的代码和你写的非常接近。我创建了一个接口(IEnumerador),并在客户机和供应商类上实现它。现在的问题是,我需要创建一个方法,该方法返回IENumerador的集合,该集合可能来自客户机或供应商在客户机调用时进行的暂挂。如果WCF不在两者之间,我可以这样做:public IEnumerable GetEnumerador(类型),但我不会使用WCF。
public class Enumerador
{
public int ID{ get; set; }
public string Description{ get; set; }
}
public interface IEnumerador
{
IEnumerable<Enumerador> Enumerar();
}
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();
}
}