我对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()返回数据库信息? 也许我正在使用的分层架构并不适合我想要的...... 感谢
答案 0 :(得分:1)
您可以使用简单的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);
};
}
答案 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;