我有一个WCF客户端,它将自跟踪实体传递给使用MVVM构建的WPF应用程序。应用程序本身具有动态接口(interface)。用户可以根据自己所扮演的角色或正在执行的任务来选择希望在工作区域中看到的对象。
我的自跟踪实体具有很多导航属性,并且不需要很多。由于其中一些对象可能很大,因此我只想按要求加载这些属性。
我的应用程序如下所示:[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]
我的模型是自我跟踪实体。客户端存储库在将模型返回给请求它的ViewModel之前,先连接了LazyLoad方法(如果需要)。所有WCF服务调用都是异步的,这意味着LazyLoad方法也是异步的。
LazyLoad的实际实现给我带来了一些麻烦。这是我提出的选项。
编辑-我删除了代码示例,以尝试使其更易于阅读和理解。如果要查看它,请查看问题的先前版本
选项A
从Getter的WCF服务器异步延迟加载模型的属性
好:按需加载数据非常简单。 XAML中的绑定(bind)将加载数据,因此,如果控件在屏幕上,则数据将异步加载,并在存在该位置时通知UI。如果没有,则没有任何负载。例如,<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />将加载数据,但是如果界面的Documents部分不存在,则不会加载任何内容。
错误:在初始化之前不能在任何其他代码中使用此属性,因为它将返回一个空列表。例如,如果尚未加载文档,则以下调用将始终返回false。
public bool HasDocuments
{
get { return ConsumerDocuments.Count > 0; }
}
LoadConsumerDocumentsSync()和LoadConsumerDocumentsAsync()方法LoadDocuments,然后遍历它们并调用LoadConsumerModified和LoadConsumerCreated 。它也可以继续前进...之后,我必须输入LoadUserGroups和LoadUserSupervisor。它还具有循环循环的风险,其中像User这样的东西具有Groups[]属性,而Group这样的东西具有Users[]属性。Consumer.ConsumerDocumentsAsync而不是Consumer.ConsumerDocumentsSync。 WCF服务调用也有可能多次运行,这需要为每个导航属性(例如IsConsumerDocumentsLoaded)额外分配一个IsLoaded属性。最佳答案
仔细考虑一下,首先我必须说,您必须为该问题提供一个清晰的解决方案,当您绑定(bind)到User.Documents属性时,可以异步加载DependecyProperties,但是它的副作用非常严重解决方案。如果我们说View中的这种行为是可以的,那么我们必须非常清楚地了解其余代码的意图,这样我们就可以看到我们如何尝试访问数据-通过某种冗长的命名方式(方法,类名,方法)进行异步或同步别的)。
因此,我认为我们可以使用接近于旧.AsSynchronized()方法的解决方案,创建一个装饰器类,并为每个属性提供私有(private)/ protected AsyncLoad和SyncLoad方法,并且一个装饰器类将是每个lazyloadable的Sync或Async版本上课,更合适。
当您使用Sync装饰器装饰您的类时,它也使用Sync装饰器将每个lazyloadable类包裹在内,因此您将能够使用SynchUser(User).Documents.Counting同步类版本而没有问题,因为它会像
SynchUser(user).SyncDocuments(Documents。)。在Documents属性的重载版本中落后于此,并将调用sync getter函数。
由于同步版本和异步版本都将在同一对象上运行,因此,如果要修改任何属性,此方法将不会导致修改某些未引用的其他对象。
您的任务听起来像可以通过某种神奇的“美丽而简单”的方式解决,但我认为它不可能,或者说它不会比这简单得多。
如果仍然无法解决问题,那么还是100%确保您需要一种清晰的方法来区分代码,无论使用的是同步版本还是异步版本的类,否则您将很难维护代码库。
关于c# - 通过WCF服务的独立自跟踪实体的异步延迟加载导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875271/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m