ReactiveUI Production Est-Elle Prête?

J'ai examiné la faisabilité de l'utilisation de L'interface utilisateur réactive dans le code de production. Certaines des fonctionnalités sont vraiment attrayantes, mais j'ai des préoccupations au sujet de prendre une dépendance sur cette bibliothèque. Ceux-ci comprennent:

  1. dénomination et conventions loufoques. Par exemple, les membres protégés commençant par des minuscules et la méthode RaiseAndSetIfChanged dépend de votre membre privé commençant par un trait de soulignement. Je comprends que Paul Betts (auteur ReactiveUI) a un fond Ruby, donc je suppose que c'est là que l'étrange dénomination provient de. Cependant, cela causera un vrai problème pour moi, puisque la dénomination standard (selon Stylecop) est appliquée tout au long de mon projet. Même si ce n'était pas appliqué, je serais préoccupé par l'incohérence résultante dans la dénomination que cela causera.
  2. manque de documentation / échantillons. Il y a une documentation et un échantillon Solitaire. Cependant, la documentation n'est qu'une série de (anciens) articles de blog et l'exemple est basé sur V2 de la bibliothèque (il est maintenant sur V4).
  3. Impair conception, dans les pièces. Par exemple, la journalisation est prélevée afin de ne pas prendre une dépendance sur un de journalisation. Juste assez. Cependant, puisque j'utilise log4net (et non NLog) j'aurai besoin de mon propre adaptateur. Je pense que cela m'obligera à implémenter IRxUIFullLogger, qui a un crapload métrique de méthodes (bien plus de 50). J'aurais pensé qu'une bien meilleure approche serait de définir une interface très simple, puis de fournir des méthodes d'extension dans ReactiveUI pour faciliter toutes les surcharges requises. Dans de plus, il y a cette étrange interface IWantsToRegisterStuff dont dépend l'assemblage NLog, dont je ne pourrai pas dépendre (car c'est une interface interne). J'espère que je n'ai pas besoin de ça...

    Quoi qu'il en soit, ma préoccupation ici est la conception globale de la bibliothèque. Quelqu'un a été mordu par cette?

  4. j'utilise déjà beaucoup MVVM Light. Je sais que Paul a fait un article de blog où il explique que vous pouvez techniquement utiliser les deux, mais ma préoccupation est plus autour de la maintenabilité. Je soupçonne que ce serait horriblement confus ayant les deux entremêlés dans sa base de code.

Quelqu'un a-t-il une expérience pratique de L'utilisation de L'interface utilisateur réactive en production? Si oui, êtes-vous en mesure d'apaiser ou de répondre à l'une de mes préoccupations ci-dessus?

37
demandé sur Kent Boogaart 2013-01-21 14:40:55

3 réponses

Passons en revue vos préoccupations pièce par pièce:

#1. "Farfelues et les conventions de nommage."

Maintenant que ReactiveUI 4.1 + a CallerMemberName, vous n'avez pas besoin d'utiliser les conventions du tout (et même alors, vous pouvez les remplacer via RxApp.GetFieldNameForPropertyFunc). Il suffit d'écrire une propriété comme:

int iCanNameThisWhateverIWant;
public int SomeProperty {
    get { return iCanNameThisWhateverIWant; }
    set { this.RaiseAndSetIfChanged(ref iCanNameThisWhateverIWant, value); }
}

#2. Manque de documentation / échantillons

C'est légitime, mais voici quelques docs / échantillons:

#3. "J'aurais pensé qu'une bien meilleure approche serait de définir une interface très simple et ensuite de fournir des méthodes d'extension au sein de ReactiveUI pour faciliter tout le nécessaire surcharges"

Implémenter IRxUILogger au lieu de cela, il a un peu deux méthodes :) ReactiveUI remplira le reste. IRxUIFullLogger est seulement là si vous en avez besoin.

"en outre, il y a cette interface IWantsToRegisterStuff étrange"

Vous n'avez pas besoin de savoir à ce sujet :) ceci est seulement pour traiter avec ReactiveUI s'initialisant afin que vous n'ayez pas besoin d'avoir du code standard.

  1. " je soupçonne que ce serait horriblement déroutant d'avoir les deux entremêlés dans sa base de code."

Pas vraiment. Il suffit de penser comme "lumière MVVM avec des superpuissances".

32
répondu Paul Betts 2016-07-16 08:05:51

Je réponds en tant que quelqu'un qui a utilisé ReactiveUI dans quelques systèmes de production, a eu des problèmes avec la façon dont rxui fait des choses, et a soumis des correctifs pour essayer de résoudre les problèmes que J'ai eu.

Avertissement: je n'utilise pas toutes les fonctionnalités de RxUI. La raison étant que je ne suis pas d'accord avec la façon dont ces fonctionnalités ont été mises en œuvre. Je détaillerai mes changements au fur et à mesure.

  1. Nommer. J'ai pensé que c'était bizarre aussi. Cela a fini par être l'une des fonctionnalités que je n'utilise pas vraiment. J'utilise PropertyChanged.Fody à tisser dans la notification de changement en utilisant AOP. En conséquence, mes propriétés ressemblent à des propriétés automatiques.

  2. Doco. Oui, il pourrait être plus. Surtout avec les nouvelles pièces comme le routage. C'est peut-être une raison pour laquelle je n'utilise pas tout RxUI.

  3. La Journalisation. J'ai eu des problèmes avec cela dans le passé. Voir pull request 69. À la fin de la journée, je vois RxUI comme un cadre très opiniâtre. Si vous n'êtes pas d'accord avec cette opinion vous pouvez suggérer des changements, mais c'est tout. Opiniâtre ne le rend pas mauvais.

  4. J'utilise RxUI avec Caliburn Micro. Cm Poignées vue-ViewModel emplacement et liaison, écran et conducteurs. Je n'utilise pas la convention de cm. Rxui gère les commandes et le code INPC ViewModel, et me permet de réagir aux changements de propriété en utilisant Reactive au lieu des approches traditionnelles. En gardant ces choses séparées, je trouve beaucoup plus facile de mélanger les deux ensemble.

Est-ce que l'un de ces problèmes a quelque chose à voir avec être prêt à la production? Nope. ReactiveUI est stable, a une base d'utilisateurs de taille décente, les problèmes sont résolus rapidement dans le google group et Paul est réceptif à la discussion.

12
répondu Cameron MacFarland 2013-01-22 00:42:36

Je l'utilise en production et Jusqu'à présent RxUI a été parfaitement stable. L'application a eu des problèmes de stabilité, certains à voir avec EMS, d'autres avec un gestionnaire UnhandledException qui causait plus de problèmes qu'il ne résolvait, mais je n'ai eu aucun problème avec la partie ReactiveUI de l'application. Cependant, j'ai eu des problèmes concernant ObservableForProperty ne tirant pas du tout, que j'ai peut-être utilisé incorrectement et qui a fonctionné de manière cohérente (incorrectement) dans mon code de test ainsi que dans L'interface utilisateur au moment de l'exécution.

-1. Paul explique que le _Upper est dû à l'utilisation de la réflexion pour accéder au champ privé de votre classe. Vous pouvez utiliser un bloc comme ci-dessous pour gérer les messages StyleCop et Resharper, ce qui est facile à générer (à partir du SmartTag 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;
    ....

Ou modifiez vos propriétés à partir de

    /// <summary>Gets or sets a value indicating whether is selected.</summary>
    public bool IsSelected
    {
        get { return _IsSelected; }
        set { this.RaiseAndSetIfChanged(x => x.IsSelected, value); }
    }

À ses composants tels que

    /// <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);
            }
        }
    }

Ce modèle est également utile lorsque vous ne fournissez pas réellement une propriété "simple" accesseur, mais peut nécessiter une variante plus dérivée où la définition d'une valeur affecte plusieurs autres.

-2. Oui, la documentation n'est pas idéale mais j'ai trouvé qu'après Rx, ramasser les échantillons RxUI était assez facile. Je note également que les sauts de 2 - > 4 semblent avoir tous venir avec les changements pour prendre en charge Windows 8 / Windows 8 Phone, et après avoir ramassé ReactiveUI pour une application Windows Store, le support DotNet 4.5 est excellent. c'est-à-dire que l'utilisation de [CallerName] signifie Maintenant que vous ce.RaiseAndSetIFChanged (value) pas besoin de l'expression.

-3. Je n'ai pas de commentaires du côté de la journalisation car je n'ai pas choisi de l'utiliser.

-4. Je n'ai pas non plus mélangé et assorti avec d'autres cadres.

Il y a aussi une liste d'autres contributeurs à ReactiveUI 4.2 à http://blog.paulbetts.org/index.php/2012/12/16/reactiveui-4-2-is-released / , y compris Phil Haack.

5
répondu AlSki 2013-01-21 13:59:19