Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF&;Silverlight:没有接口怎么办?_C#_Silverlight_Wcf_Visual Studio 2010 - Fatal编程技术网

C# WCF&;Silverlight:没有接口怎么办?

C# WCF&;Silverlight:没有接口怎么办?,c#,silverlight,wcf,visual-studio-2010,C#,Silverlight,Wcf,Visual Studio 2010,让我试着解释一下我的挑战。我正在构建一个Silverlight应用程序,它将使用WCF服务 WCF服务返回一个用户和角色列表(还有更多,但尽量保持简单) 在SL应用程序中,我需要用用户和角色列表填充几个组合框。通常我会使用一个接口来指定键和值对,并且可以简单地将它们绑定到组合框 但遗憾的是,WCF不提供接口,只提供数据类。什么样的解决方案才能得到我想要的 我开始时使用了一个GetList方法,但它缺少了一些魔力。或者使用一个带有key/value的“generic”类,编写一个Operation

让我试着解释一下我的挑战。我正在构建一个Silverlight应用程序,它将使用WCF服务

WCF服务返回一个用户和角色列表(还有更多,但尽量保持简单)

在SL应用程序中,我需要用用户和角色列表填充几个组合框。通常我会使用一个接口来指定键和值对,并且可以简单地将它们绑定到组合框

但遗憾的是,WCF不提供接口,只提供数据类。什么样的解决方案才能得到我想要的

我开始时使用了一个GetList方法,但它缺少了一些魔力。或者使用一个带有key/value的“generic”类,编写一个OperationContract,返回这些

我说得通吗?你会怎么做

public class Users
{
    public string Name { get; set; }
    public int Id { get; set; }
    //Etc lastname, password
}

public class Roles
{
    public string Name { get; set; }
    public int Id { get; set; }
    //Etc icon, superuser, whatnot
}

public class Pager
{
    public static List<KeyValuePair<string, int>> GetList(List<object> itemlist)
    {
        var result = new List<KeyValuePair<string, int>>();
        //Do some magic

        return result;
    }
公共类用户
{
公共字符串名称{get;set;}
公共int Id{get;set;}
//Etc姓氏、密码
}
公共类角色
{
公共字符串名称{get;set;}
公共int Id{get;set;}
//Etc图标、超级用户等等
}
公共类寻呼机
{
公共静态列表GetList(列表项列表)
{
var result=新列表();
//施点魔法
返回结果;
}
编辑
使用抽象类会有所帮助。在我需要更多的“接口”之前,…

听起来您希望跨一组实体标准化
Id
Name
属性。要做到这一点,您需要从一个接口开始:

public interface INamedEntity
{
    int Id { get; }

    string Name { get; }
}
然后,您将在每个实体的分部类中实现该接口:

public partial class User : INamedEntity
{
    // ...
}

public partial class Role : INamedEntity
{
    // ...
}
由于这些类型已经包含
Id
Name
,因此会自动满足该接口


这就是你想问的问题吗?

当你通过WCF“在线”接收到一些东西时,你得到的是一个具体的实现。没有提供接口是有道理的,因为这些接口是抽象的,你得到的是具体的类型

但是,有两种方法可以在导线上保留接口

正如Bryan Watts所指出的,第一个是在您的客户端上实现接口。我很少使用直接从WCF服务传递的代理项;相反,我通常将它们移动到客户端上的其他对象中,这些对象可以有自己的接口、基类等。我将WCF用作数据泵,然后将数据水合物化为concre在客户端定义的te类

虽然有些人会指出这看起来是额外的工作,但我不同意。我很少“先服务”构建应用程序如果我有一个小部件要处理,我将为我的小部件定义模型,甚至构建测试,并可以绑定到视图等。服务只是一个返回小部件的接口,因此我从服务中抽象出来,可以在没有它的情况下进行测试。当服务可用时,我可以简单地从服务器映射什么代理类型,并将其移动到我定义的小部件中


第二种方法是使用一种投影数据的技术,例如WCF RIA。WCF RIA将使用生成的代码来创建客户端服务器上定义的代码映射。这意味着行为和注释通过代码投影到客户端。就我个人而言,我仍然会抽象出来,而不是直接绑定到WCF RIA模式ls,所以我倾向于最常使用第一个选项。

如果可以与WCF服务一起使用,这将是正确的答案。问题是接口不能与WCF一起使用(除非我完全错了)我假设您将在客户机上实现接口,在客户机上定义代理。如果您谈论的是将接口放在服务器上的实体上,那就不同了。谢谢,这很有意义!