WCF и Silverlight: как обойтись без интерфейсов? - PullRequest
1 голос
/ 05 августа 2010

Позвольте мне попытаться объяснить мою проблему. Я создаю приложение Silverlight, которое будет использовать сервис WCF.

Служба WCF возвращает список пользователей и ролей (и многое другое, но пытается упростить его).

В приложении SL мне нужно заполнить несколько списков со списками пользователей и ролей. Обычно я использовал бы интерфейс для указания пары ключ-значение и мог бы просто связать их со списком

Но, увы, WCF не предоставляет интерфейсы только для классов данных. Какое было бы хорошее решение, чтобы получить то, что я хочу.

Я начал с метода GetList, но в нем отсутствовало какое-то волшебство. Или, может быть, использовать «универсальный» класс с ключом / значением и написать OperionContract, который возвращает эти ...

Имею ли я какой-то смысл и что бы вы сделали?

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

EDIT Использование абстрактного класса помогает немного. Пока мне не нужно больше «интерфейсов» ..

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Когда вы получаете что-то «по проводам» через WCF, вы получаете конкретную реализацию.Имеет смысл, что интерфейсы не предоставляются, потому что они абстрактные, и вы получаете конкретные типы.

Однако есть два способа сохранить интерфейс по проводам.

Первое, как указал Брайан Уоттс, - это реализовать интерфейс на вашем клиенте.Я редко использую прокси-элементы, которые передаются непосредственно из службы WCF;вместо этого я обычно перемещаю их в другие объекты на клиенте, которые могут иметь свои собственные интерфейсы, базовые классы и т. д. Я использую WCF в качестве источника данных, а затем гидратирую данные в конкретные классы, определенные на клиенте.

Хотя некоторые люди отмечают, что это похоже на дополнительную работу, я не согласен.Я редко создаю приложение «сначала сервис».Если у меня есть виджет, с которым я буду иметь дело, я определю модель для своего виджета, даже создам тесты и могу связываться с представлениями и т. Д. Сервис - это просто интерфейс для возврата виджетов, поэтому я абстрагирован от сервиса и могу тестироватьбез этого.Когда служба становится доступной, я могу просто сопоставить тип прокси-сервера с сервера и переместить его в свой определенный виджет.

Второй способ - использовать технологию проецирования данных, такую ​​как WCF RIA.WCF RIA будет использовать сгенерированный код для создания карты кода, определенного на сервере на клиенте.Это означает, что поведение и аннотации проецируются клиенту через код.Лично я все же заканчиваю абстрагированием и не привязываюсь напрямую к моделям WCF RIA, поэтому чаще всего использую первый вариант.

1 голос
/ 05 августа 2010

Похоже, вы хотите стандартизировать свойства Id и Name для набора объектов.Для этого вы должны начать с интерфейса:

public interface INamedEntity
{
    int Id { get; }

    string Name { get; }
}

Затем вы реализуете этот интерфейс в частичном классе каждой сущности:

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

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

Поскольку эти типы уже содержат Id и Name, интерфейс автоматически выполняется.

Это то, что вы хотели задать своим вопросом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...