我一直在研究在生产代码中使用Reactive UI的可行性.一些功能真的很吸引人,但我担心依赖这个库.这些包括:
RaiseAndSetIfChanged方法取决于以下划线开头的私有成员.我理解Paul Betts(ReactiveUI作者)有Ruby背景,所以我想这就是奇怪的命名源于此.但是,这会给我带来真正的问题,因为标准命名(根据Stylecop)在整个项目中都是强制执行的.即使没有强制执行,我也会担心这会导致命名的不一致.奇怪的设计,部分.例如,日志记录是抽象的,以便不依赖于特定的日志记录框架.很公平.但是,由于我使用log4net(而不是NLog),我需要自己的适配器.我认为这将需要我实现IRxUIFullLogger,其中包含一个公制的方法(超过50).我认为一个更好的方法是定义一个非常简单的接口,然后在ReactiveUI中提供扩展方法,以促进所有必需的重载.另外,IWantsToRegisterStuffNLog程序集所依赖的这个奇怪的接口,我将无法依赖它(因为它是一个内部接口).我希望我不需要......
无论如何,我关心的是图书馆的整体设计.有没有人被这个咬过?
有没有人有在生产中使用Reactive UI的实践经验?如果是这样,您是否能够减轻或解决我上述任何疑虑?
我一直在使用Caliburn Micro作为我们的MVVM框架在新的Silverlight应用程序上做一些原型工作.团队一直很满意.为了解决对服务的限制请求的一些问题,建议我查看ReactiveUI的ReactiveCollections及其INotifyPropertyChanged的实现.
有没有人有任何使用这两者的经验?因为它们都是主要的MVVM框架,所以有很多重叠,所以我想知道它是否可能比尝试使它们一起工作更麻烦.
我们真正喜欢Caliburn Micro的一些事情是:
ReactiveUI的东西吸引了我们(至少最初).
我几乎没有机会玩ReactiveUI,但是当我看着它并看到两者之间的重叠时,我想知道谁可能试图将两者都用于一个项目.我无法通过谷歌找到任何东西(这可能是我的错).
我很想知道你是否尝试过这个; 你有什么问题?您使用了每个框架的哪些部分?为什么?是否有任何好的例子或博客文章一起使用它们?
干杯,
史蒂夫
Reactive UI中有几种扩展方法,用于获取属性更改的可观察对象.
我想我明白WhenAny和WhenAnyValue. WhenAny用于一系列属性更改通知,其中您希望哪个对象和属性的元数据发生了更改,而WhenAnyValue当您真正想要更改值的流时.
首先,这是一个准确的评估吗?
怎么样WhenAnyDynamic,WhenAnyObservable和ObservableForProperty?我无法弄清楚它们的用途,或者它们与前两个有何不同.它们都是供公众使用的吗?他们的目的是什么?
来自http://docs.reactiveui.net/en/index.html:
ReactiveUI是一个MVVM框架,允许您使用Reactive Extensions for .NET创建在任何移动或桌面平台上运行的优雅,可测试的用户界面.
RxUI与Reactive Extensions有什么不同?
为什么我更喜欢RxUI而不是MVVMCross/light + Rx?有什么特别的?RxUI可以做一些Rx不能做的事情吗?它更简洁吗?它更舒适吗?
我在github页面https://github.com/reactiveui/ReactiveUI#a-compelling-example上看到了一些例子.但是我不能只用Rx做同样的事情吗?
PS那里有API doc吗?
标题说明了一切.根据您的经验,两个框架之间的关键区别是什么?当我们应该使用一个而不是另一个?
预期用途:跨平台开发(Windows 8,iOS,Android,WindowsRT,Mac).
想象一下我正在使用集团来处理网络请求。如果请求失败,则根据平台的不同,处理失败的方法也会有所不同。在我的Web应用程序上,我想将用户重定向到错误页面,而在IOS应用程序上,我想显示一个对话框。
由于仅应使用bloc并共享它来处理业务逻辑,并且错误处理部分与业务逻辑无关,因此,我们应该请UI部分照顾错误处理。
UI可以将错误回调发送到块,并且当发生错误时,块将运行它。我们还可以通过在不同平台上发送不同的回调,以特定于平台的方式处理错误。
接下来是我的两个问题:
在flutter中,我们只能在initState生命周期方法之后访问bloc (因为我们是从builder上下文中获取bloc的,而后者仅在之后initState)。然后,我们只能在build方法中发送回调。
这样,每次重建时,我们都会重复向回调发送bloc(这些重复没有意义)。使用react,可以在生命周期(例如)中完成一次一次性初始化componentDidMount。在颤振中,我们如何达到只运行一次初始化的目标?
我有以下代码:
ViewPortViewModel _Trochoid;
public ViewPortViewModel Trochoid
{
get { return _Trochoid; }
set { this.RaiseAndSetIfChanged(value); }
}
Run Code Online (Sandbox Code Playgroud)
使用ReactiveUI INPC支持.编译器始终警告我Trochoid永远不会分配给它,并且始终为null.然而,由于RaiseAndSetIfChanged通过CallerMemberName支持执行的魔术,代码确实有效并且编译器是错误的.
如何在我的代码中干净地压制这些警告?
c# inotifypropertychanged suppress-warnings reactiveui callermembername
我查看了一些ReactiveUI示例,但是我看不到一个如何处理异常的简单示例,其中应该向用户显示消息.(如果有一个很好的例子可以有人指出我吗?).
我的第一个问题是如何使用ReactiveCommand和ToProperty处理异常.例如,我有以下代码:
public class MainWindowViewModel : ReactiveObject
{
public ReactiveCommand CalculateTheAnswer { get; set; }
public MainWindowViewModel()
{
CalculateTheAnswer = new ReactiveCommand();
CalculateTheAnswer
.SelectMany(_ => AnswerCalculator())
.ToProperty(this, x => x.TheAnswer);
CalculateTheAnswer.ThrownExceptions
.Select(exception => MessageBox.Show(exception.Message));
}
private readonly ObservableAsPropertyHelper<int> _theAnswer;
public int TheAnswer
{
get { return _theAnswer.Value; }
}
private static IObservable<int> AnswerCalculator()
{
var task = Task.Factory.StartNew(() =>
{
throw new ApplicationException("Unable to calculate answer, because I don't know what the question is");
return 42;
});
return task.ToObservable();
} …Run Code Online (Sandbox Code Playgroud) 我试图在使用Prism 的WPF应用程序中使用ReactiveUI.我使用NuGet安装了软件包,但只是添加了引用,导致在ModuleCatalog初始化期间标题中指定的异常.
编辑:
正如Pierre Arnaud指出的那样,问题是Microsoft.Bcl.Async无法解析System.Core版本2.0.5.0.
自从我第一次发布这个问题以来,我们搬到了Visual Studio 2012.同样的问题仍然存在,我甚至无法安装皮埃尔建议的修复程序,因为我现在安装了.Net 4.5.该项目仍然以.Net 4.0为目标.
我正在尝试在测试中使用带有异步方法的reactiveui测试调度程序.
等待异步调用时,测试挂起.
根本原因似乎是异步方法中等待的命令.
[Fact]
public async Task Test()
=> await new TestScheduler().With(async scheduler =>
{
await SomeAsyncMethod();
// *** execution never gets here
Debugger.Break();
});
private async Task SomeAsyncMethod()
{
var command = ReactiveCommand.CreateFromTask(async () =>
{
await Task.Delay(100);
});
// *** this hangs
await command.Execute();
}
Run Code Online (Sandbox Code Playgroud)
如何与没有死锁的测试调度程序一起执行异步调用?
我正在使用reactiveui 9.4.1
编辑:
我已经尝试了WithAsync()Funks答案中建议的方法,但行为是一样的.