Использование WCF из других проектов - PullRequest
0 голосов
/ 22 марта 2012

Я очень плохо знаком с услугами Silverlight и WCF Ria. У меня есть опыт работы в WPF и WinForms.

Сейчас я занимаюсь разработкой приложения silverlight, которое в основном состоит из веб-страницы, извлекающей данные с удаленного сервера.

Я прочитал множество форумов и статей, которые объясняют, как использовать и использовать веб-сервисы и WCF. Я следовал пошаговой инструкции msdn о том, как создать простое приложение, которое получает данные из БД, и оно прекрасно работает.

Проблема в том, что мне не нужен код или ресурс, связанный с WCF, в моих элементах управления пользовательским интерфейсом. Прямо сейчас я использую архитектуру многоуровневого программирования:

UI -> BLL -> DAL

Каждый из этих элементов представляет собой один проект в одном решении. Мой проект DAL - это веб-служба (WCF Ria), которая взаимодействует с сервером.

У меня есть простой класс (User Service) и метод (GetUsers) в моем проекте DAL со следующим кодом:

        LoadOperation<u_WEBUSERS> loadOp = this.userContext.Load(this.userContext.GetU_WEBUSERSQuery());
        loadOp.Completed += (sender, args) =>
        {
            users = new List<UserObj>();
            foreach (var v in loadOp.Entities)
            {
                u_WEBUSERS uweb = v as u_WEBUSERS;
                UserObj u = new UserObj();

                u.Nome = uweb.nome;
                u.Morada = uweb.morada;
                users.Add(u);
            }
        };
        return users;

Дело в том, что мой объект users возвращает null. Если я остановлюсь на точке останова, я увижу, что сначала завершается метод, и только после вызывается завершенное событие.

Есть ли способ заставить мой GetUsers () возвращать информацию базы данных? Может быть, многоуровневая архитектура, которую я использую, не подходит для того, что я хочу ... Спасибо

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Вы можете использовать простой Action или Action<T> делегат:

public void LoadUsers(Action<IEnumerable<UserObj>> callBack)
{
    LoadOperation<u_WEBUSERS> loadOp = this.userContext.Load(this.userContext.GetU_WEBUSERSQuery());
    loadOp.Completed += (sender, args) =>
    {
        users = new List<UserObj>();
        foreach (var v in loadOp.Entities)
        {
            u_WEBUSERS uweb = v as u_WEBUSERS;
            UserObj u = new UserObj();

            u.Nome = uweb.nome;
            u.Morada = uweb.morada;
            users.Add(u);
        }
        if(callBack != null)
            callBack(users);
    };
}
0 голосов
/ 22 марта 2012

Вы смешиваете синхронный и асинхронный код вместе. Вы настраиваете завершенное событие, но вызов не возвращается, пока не завершится, если вы не укажете обработчик. Смотрите пример здесь . Итак, ваш код будет:

LoadOperation<u_WEBUSERS> loadOp =   this.userContext.Load(this.userContext.GetU_WEBUSERSQuery());
users = new List<UserObj>();
foreach (var v in loadOp.Entities)
{
     u_WEBUSERS uweb = v as u_WEBUSERS;
     UserObj u = new UserObj();

     u.Nome = uweb.nome;
     u.Morada = uweb.morada;
     users.Add(u);
 }
 return users;
...