代码之家  ›  专栏  ›  技术社区  ›  Ralf de Kleine

WCF和Silverlight:没有接口怎么办?

  •  1
  • Ralf de Kleine  · 技术社区  · 15 年前

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

    wcf服务返回一个用户和角色列表(还有很多,但要保持简单)。

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

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

    我开始使用getlist方法,但它缺少一些魔力。或者可以使用带有键/值的“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;
        }
    

    编辑 使用抽象类有点帮助。直到我需要更多的“接口”…

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jeremy Likness    15 年前

    当您通过WCF接收到“通过网络”的东西时,您将得到一个具体的实现。因为接口是抽象的,所以不提供这些接口是有意义的,而且您得到的是具体的类型。

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

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

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

    第二种方法是使用一种可以投射数据的技术,比如wcf ria。WCF RIA将使用生成的代码创建在客户机上的服务器上定义的代码的映射。这意味着行为和注释是通过代码投影到客户机的。就个人而言,我最终还是抽象化了,并没有直接绑定到WCF RIA模型,所以我倾向于经常使用第一个选项。

        2
  •  1
  •   Bryan Watts    15 年前

    听起来您想标准化 Id Name 一组实体的属性。为此,您将从一个接口开始:

    public interface INamedEntity
    {
        int Id { get; }
    
        string Name { get; }
    }
    

    然后,您将在每个实体的分部类中实现该接口:

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

    因为这些类型已经包含 身份证件 名字 ,界面自动满足。

    这就是你想问的问题吗?