WPF、WCF和代码优先断开连接模式
本文关键字:断开 连接 模式 代码 WCF WPF | 更新日期: 2023-09-27 18:00:25
一些架构难题:我使用WPF作为我的客户端,使用EF Code First作为我的数据访问层,并使用WCF来连接它们。我的问题是在我对DB做了一些更改后,为什么要重新更新UI,例如:
- 用户在UI上插入新的"人员"(ID=0)
- 用户将"人员"保存到数据库(例如,ID=10)
当谈到一个用户时,这很简单——我可以返回ID并更新我的UI(因此对此人的下一次更改将被视为"更新"),但一次添加多个用户或更新服务器上计算的其他属性如何?我应该返回整个图形吗?更不用说在客户端重新映射它是非常困难的。
在CodeFirst之前,我们可以使用STE,但它也有自己的问题。有人知道已知的CodeFirst方法吗?
很高兴听到你的声音。谢谢
您可以将客户端上一次更新的日期时间作为请求发送到您的wcf服务。但在服务器端,您获取在该日期Time之后更新/添加的所有Persons
,并将其作为结果返回。通过这种方式,您将只从服务器端获得修改/添加的Person
。
因此,将lastUpdate collmn添加到实体Person
中。
编辑1
如果您想通过服务器更新客户端中的信息,而不是客户端,请向服务器询问消息。
您可以像在Web Programming
中那样使用它。
(1) client-side
询问server-side
-"嘿,我的最后一次更新是在2013年2月10日20:00",然后服务器查看DB-"2013年10月20日20:00之后是新闻吗?"如果是:
a) 将消息返回给客户端
如果数据库中没有消息:
b) 他不返回null,但他返回Thread.Sleep(somevalue)。他睡着了,然后向数据库重复查询,并询问"数据库中有消息"。所以这一切都在重复,直到DB的消息出现。数据库中的消息出现后,他返回日期Time后更新的List<data>
。在该客户端获得数据之后,他返回到点-(1)。
所以你不会向服务器发出很多请求,而是只发出一个请求,然后等待来自服务器的消息。
注意2件事:
1) 如果客户端等待时间过长,服务器端将抛出异常(实际上不记得错误代码,但现在已经不重要了),因此您必须在client-side
上捕获此异常,并向server-side
发出新请求。此外,您必须在server-side
上进行配置,只要您可以等待时间,以最大限度地减少来自客户端的请求量。
2) 您必须在新线程中运行这个data-updater
,而不是在应用程序运行的主线程中。
从代码中看它会是什么样子(它可能不起作用,我只想向你展示逻辑):
服务器端:
public List<SomeData> Updater(DateTime clientSideLastUpdate)
{
List<SomeData> news = new List<SomeData>();
while(true)
{
List<SomeData> news = dbContext.SomeData.Where(e=>e.UpdateDateTime > clientSideLastUpdate).ToList();
if(news.Count()>0)
{
return news;
}
}
}
客户端:
public static void Updater()
{
try
{
var news = someServiceReference.Updater(DateTime clientSideLastUpdate);
RenewDataInForms(news);
Updater();
}
catch(ServerDiesOrWhatElseExcepption)
{
Updater()
}
}
在代码的某个地方,你在新线程中运行这个更新程序
Thread updaterThread = new Thread(Updater());
updaterThread.Start();
编辑2
如果你想通过一个请求更新所有实体,而不仅仅是SomeData
,那么你必须添加Dto对象,它将包含你想更新的每个实体的列表。server-side
将完成并返回此Dto对象。
希望能有所帮助。