私は本番コードでリアクティブUIを使用することの実現可能性を調査してきました。いくつかの機能は本当に魅力的ですが、私はこのライブラリに依存することに懸念を抱いています。これらには以下が含まれます:
RaiseAndSetIfChanged
メソッドは、アンダースコアで始まるプライベートメンバーに依存します。 Paul Betts(ReactiveUIの作者)がRubyの背景を持っていることを理解しているので、それが奇妙な命名の由来だと思います。しかし、これは私にとって本当の問題を引き起こします。 Stylecop)は私のプロジェクト全体で実施されています。実施されていなくても、名前の不一致が原因で発生するのではないかと心配しています。部分的に奇妙なデザイン。たとえば、ロギングは、特定のロギングフレームワークに依存しないように抽象化されています。けっこうだ。ただし、(NLogではなく)log4netを使用しているため、独自のアダプターが必要になります。 IRxUIFullLogger
を実装する必要があると思います。これには、メソッドのメトリッククラップロードが含まれています(50をはるかに超えています)。非常に単純なインターフェイスを定義してから、ReactiveUI内に拡張メソッドを提供して、必要なすべてのオーバーロードを容易にするのが、はるかに優れたアプローチだと思いました。さらに、NLogアセンブリが依存するこの奇妙なIWantsToRegisterStuff
インターフェイスがあり、私は依存できません(これは内部インターフェイスであるため)。私はそれを必要としないことを望んでいます...
とにかく、ここでの私の懸念は、ライブラリの全体的なデザインです。誰かがこれに噛まれたことがありますか?
本番環境でReactiveUIを使用した経験のある人はいますか?もしそうなら、あなたは私の上記の懸念のいずれかを和らげるか、対処することができますか?
あなたの懸念を少しずつ見ていきましょう:
#1。 「奇抜な命名と慣習。」
ReactiveUI 4.1以降にCallerMemberNameが含まれるようになったので、規則を使用する必要はまったくありません(それでも、RxApp.GetFieldNameForPropertyFunc
を介して規則をオーバーライドできます)。プロパティを次のように記述します。
int iCanNameThisWhateverIWant;
public int SomeProperty {
get { return iCanNameThisWhateverIWant; }
set { this.RaiseAndSetIfChanged(ref iCanNameThisWhateverIWant, value); }
}
#2。ドキュメント/サンプルの欠如
これは合法ですが、ここにいくつかのドキュメント/サンプルがあります:
#3。 「はるかに優れたアプローチは、非常に単純なインターフェイスを定義してから、ReactiveUI内に拡張メソッドを提供して、必要なすべてのオーバーロードを容易にすることだと思いました。」
代わりにIRxUILogger
を実装しますが、2つのメソッドはほとんどありません:)ReactiveUIが残りを埋めます。 IRxUIFullLogger
は、必要な場合にのみ存在します。
「さらに、この奇妙なIWantsToRegisterStuffインターフェースがあります」
これについて知る必要はありません:)これは、ReactiveUIがそれ自体を初期化するのを処理するためだけのものであるため、定型コードを用意する必要はありません。
- 「両方がコードベースに混在していると、恐ろしく混乱するだろうと思います。」
あんまり。 「スーパーパワーを備えたMVVMライト」と考えてください。
私は、いくつかの本番システムでReactiveUIを使用し、RxUIの処理方法に問題があり、問題を修正するためのパッチを提出した人として回答しています。
免責事項:私はRxUIのすべての機能を使用しているわけではありません。その理由は、これらの機能の実装方法に同意できないからです。変更内容について詳しく説明します。
ネーミング。これも変だと思いました。これは、私が実際には使用しない機能の1つになりました。 PropertyChanged.Fodyを使用して、AOPを使用して変更通知を織り込みます。その結果、私のプロパティは自動プロパティのように見えます。
ドコ。はい、もっとあるかもしれません。特にルーティングのような新しいパーツでは。これが、私がすべてのRxUIを使用しない理由である可能性があります。
ロギング。私は過去にこれに問題がありました。 プルリクエスト69 を参照してください。結局のところ、私はRxUIを非常に意見の分かれるフレームワークと見なしています。その意見に同意しない場合は、変更を提案できますが、それだけです。意見はそれを悪くしません。
CaliburnMicroでRxUIを使用しています。 CMは、View-ViewModelの場所とバインディング、画面とコンダクターを処理します。 CMのコンベンションバインディングは使用していません。 RxUIはコマンドとViewModelINPCコードを処理し、従来のアプローチの代わりにReactiveを使用してプロパティの変更に対応できるようにします。これらを別々に保つことで、2つを混ぜ合わせるのがはるかに簡単になります。
これらの問題のいずれかは、本番環境の準備ができていることと関係がありますか?いいえ。 ReactiveUIは安定しており、適切なサイズのユーザーベースがあり、問題は google group ですぐに解決され、Paulは議論を受け入れます。
私はそれを本番環境で使用していますが、これまでのところRxUIは完全に安定しています。アプリケーションには安定性の問題があり、EMSに関係するものもあれば、UnhandledExceptionハンドラーに問題があり、解決するよりも多くの問題を引き起こしていましたが、アプリケーションのReactiveUI部分に問題はありませんでした。ただし、ObservableForPropertyがまったく起動しないという問題がありました。これは、誤って使用し、テストコードと実行時のUIで一貫して(誤って)機能した可能性があります。
-1。 Paulは、_Upperは、リフレクションを使用してクラスのプライベートフィールドに到達するためであると説明しています。以下のようなブロックを使用して、(Resharper SmartTagから)簡単に生成できるStyleCopメッセージとResharperメッセージを処理できます。
/// <summary>The xxx view model.</summary>
public class XXXViewModel : ReactiveObject
{
#pragma warning disable 0649
// ReSharper disable InconsistentNaming
[SuppressMessage("StyleCop.CSharp.NamingRules",
"SA1306:FieldNamesMustBeginWithLowerCaseLetter",
Justification = "Reviewed. ReactiveUI field.")]
private readonly bool _IsRunning;
[SuppressMessage("StyleCop.CSharp.NamingRules",
"SA1306:FieldNamesMustBeginWithLowerCaseLetter",
Justification = "Reviewed. ReactiveUI field.")]
private string _Name;
....
またはプロパティを完全から変更します
/// <summary>Gets or sets a value indicating whether is selected.</summary>
public bool IsSelected
{
get { return _IsSelected; }
set { this.RaiseAndSetIfChanged(x => x.IsSelected, value); }
}
のようなその構成部品に
/// <summary>Gets or sets a value indicating whether is selected.</summary>
public bool IsSelected
{
get { return _isSelected; }
set
{
if (_isSelected != value)
{
this.RaisePropertyChanging(x => x.IsSelected);
_isSelected = value;
this.RaisPropertyChanged(x=>x.IsSelected);
}
}
}
このパターンは、実際には「単純な」プロパティアクセサーを提供しない場合にも役立ちますが、1つの値を設定すると他の複数の値に影響する、より派生したバリアントが必要になる場合があります。
-2。はい、ドキュメントは理想的ではありませんが、Rxの後、RxUIサンプルを取得するのは非常に簡単であることがわかりました。また、2-> 4からのジャンプはすべて、Windows 8/Windows 8 Phoneをサポートするための変更が加えられたようであり、Windowsストアアプリ用のReactiveUIを選択したので、DotNet4.5のサポートは優れています。つまり、[CallerName]を使用するということは、単にthis.RaiseAndSetIFChanged(value)式が不要であることを意味します。
-3。私はそれを使用することを選択しなかったので、ロギング側についてのフィードバックはありません。
-4。私は他のフレームワークと混合したり一致させたりしていません。
ReactiveUI 4.2への他の貢献者のリストも http://blog.paulbetts.org/index.php/2012/12/16/reactiveui-4-2-is-released/ にあります。フィル・ハーク。