最近我试图让自己进入 UI 开发的新时代并发现了 ReactiveUI。我喜欢它的声明性。
我想做一个彻底的转变,所以我试图了解在这个 ReactiveUI 的新世界里,事情是如何发生的。我选择 ReactiveUI 是因为我看到它是由一个非常聪明的人(Paul C. Betts)维护的。
我对它还很陌生,我很可能会向 StackOverflow 提出关于它的问题,因为我有强大的力量,我认为它值得学习和掌握。
让我们进入细节:
我一直使用 View-First。我是 Cinch 框架的资深用户 ( http://cinch.codeplex.com/ )
它使用 MEF 将 ViewModel 注入(inject)每个 View 。您只需要用 [ViewModel("SampleView")] 装饰您的 ViewModel 并向您的 View 添加一个附加属性 (ViewModelLocator.ViewModel="SampleView"),每当加载 View 时,相应的 ViewModel 就会被实例化并作为其注入(inject)具有您选择的生命周期的 DataContext。
这种机制虽然有效,但也有一些不便之处。其中最糟糕的是:它使用定位器。
正如 Mark Seemann 在他的书中所建议的那样,ServiceLocator 是一种应该避免的反模式。
最佳答案
ServiceLocator is an anti-pattern that should be avoided.
我通常认为很多关于 IoC/DI 的建议在“跨平台移动应用程序”领域是非常糟糕的,因为你必须记住他们的很多想法是为网络应用程序而不是移动或桌面应用程序。
例如,绝大多数流行的 IoC 容器只关心热缓存上的解析速度,而基本上完全不考虑内存使用或启动时间——这对服务器应用程序来说是 100% 的,因为这些都不重要;但对于移动应用程序?启动时间很长。
Splat 的服务位置解决了 RxUI 的许多问题:
事实上,我大体上同意 Mark Seemann 的观点,构造函数注入(inject)是首选方式 - 这是我真正喜欢的模式:
public SuspensionHost(ISuspensionDriver driver = null)
{
driver = driver ?? Locator.Current.GetService<ISuspensionDriver>();
}
这使用服务定位接口(interface)作为默认接口(interface),但前提是调用者没有在构造函数中给出显式接口(interface)。在单元测试运行器中进行测试比尝试构建虚假 IoC 容器要简单得多,但在运行时仍会回退到默认实现。
是否可以在 ReactiveUI 中使用基于 VM 的路由(即 RoutedViewHost、IScreen、RoutingState 等)取决于您所在的平台:
关于c# - 一般的 ReactiveUI、View/ViewModel 注入(inject)和 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898381/
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p