WPF、WCF和代码优先断开连接模式

本文关键字:断开 连接 模式 代码 WCF WPF | 更新日期: 2023-09-27 18:00:25

一些架构难题:我使用WPF作为我的客户端,使用EF Code First作为我的数据访问层,并使用WCF来连接它们。我的问题是在我对DB做了一些更改后,为什么要重新更新UI,例如:

  1. 用户在UI上插入新的"人员"(ID=0)
  2. 用户将"人员"保存到数据库(例如,ID=10)

当谈到一个用户时,这很简单——我可以返回ID并更新我的UI(因此对此人的下一次更改将被视为"更新"),但一次添加多个用户或更新服务器上计算的其他属性如何?我应该返回整个图形吗?更不用说在客户端重新映射它是非常困难的。

在CodeFirst之前,我们可以使用STE,但它也有自己的问题。有人知道已知的CodeFirst方法吗?

很高兴听到你的声音。谢谢

WPF、WCF和代码优先断开连接模式

您可以将客户端上一次更新的日期时间作为请求发送到您的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对象。

希望能有所帮助。