从其他项目中消耗WCF

时间:2012-03-22 15:34:57

标签: wcf silverlight web-services

我对silverlight和WCF Ria服务很新。我有WPF和WinForms的背景经验。

现在我正在开发一个silverlight应用程序,它基本上包含从远程服务器获取数据的网页。

我阅读了很多论坛和文章,解释了如何使用和使用Web服务和WCF。我按照msdn walkthrough关于如何创建一个从数据库获取数据的简单应用程序,它运行良好。

问题是我不想在我的UI控件中使用任何与WCF相关的代码或资源。 现在我正在使用分层编程架构:

用户界面 - > BLL - > DAL

这些元素中的每一个都是同一解决方案中的单个项目。我的DAL项目是与服务器通信的Web服务(WCF Ria)。

我的DAL项目中有一个简单的类(用户服务)和方法(GetUsers),代码如下:

        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 个答案:

答案 0 :(得分:1)

您可以使用简单的ActionAction<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);
    };
}

答案 1 :(得分:0)

您将同步和异步代码混合在一起。您正在设置已完成的事件,但是当您未指定处理程序时,调用将不会返回。请参阅example here。所以你的代码是:

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;