Готова Ли Продукция ReactiveUI?
Я изучал возможность использования реактивного пользовательского интерфейса в производственном коде. Некоторые из функций действительно привлекательны, но у меня есть проблемы с зависимостью от этой библиотеки. К ним относятся:
- причудливые именования и соглашения. Например, защищенные элементы, начинающиеся с нижнего регистра, и
RaiseAndSetIfChanged
метод зависит от вашего частного члена, начинающегося с подчеркивания. Я понимаю, что Пол Беттс (автор ReactiveUI) имеет рубиновый фон, поэтому я думаю, что это откуда происходит странное название. Однако это вызовет реальную проблему для меня, так как стандартное именование (согласно Stylecop) применяется во всем моем проекте. Даже если бы это не было принудительно, я был бы обеспокоен возникающей непоследовательностью в названии, что это вызовет. - отсутствие документации / образцов. Есть некоторые документация и одинокий образец. Однако документация-это всего лишь серия (старых) сообщений в блоге, а образец основан на V2 библиотеки (теперь он включен V4).
-
странный дизайн, по частям. Например, ведение журнала абстрагируется, чтобы не принимать зависимость от определенной структуры ведения журнала. Справедливо. Однако, поскольку я использую log4net (а не NLog), мне понадобится мой собственный адаптер. Я думаю, что это потребует от меня реализации
IRxUIFullLogger
, который имеет метрическую загрузку методов в нем (более 50). Я бы подумал, что гораздо лучшим подходом было бы определить очень простой интерфейс, а затем предоставить методы расширения в ReactiveUI для облегчите все необходимые перегрузки. Кроме того, есть это странноIWantsToRegisterStuff
интерфейс, от которого зависит сборка NLog, от которого я не смогу зависеть (потому что это внутренний интерфейс). Надеюсь, мне это не понадобится...В любом случае, моя забота здесь-общий дизайн библиотеки. Кого-нибудь это укусило?
- Я уже широко использую MVVM Light. Я знаю, что Пол сделал сообщение в блоге, где он объясняет, что вы можете технически использовать оба, но моя озабоченность больше вокруг ремонтопригодности. Я подозреваю, что было бы ужасно запутанно смешивать оба в своей кодовой базе.
есть ли у кого-нибудь практический опыт использования реактивного пользовательского интерфейса в производстве? Если да, то можете ли вы смягчить или решить любую из моих вышеперечисленных проблем?
3 ответов
давайте рассмотрим ваши проблемы по частям:
#1. - Дурацкие названия и условности."
теперь, когда ReactiveUI 4.1+ имеет CallerMemberName, вам не нужно использовать соглашения вообще (и даже тогда вы можете переопределить их через RxApp.GetFieldNameForPropertyFunc
). Просто напишите свойство как:
int iCanNameThisWhateverIWant;
public int SomeProperty {
get { return iCanNameThisWhateverIWant; }
set { this.RaiseAndSetIfChanged(ref iCanNameThisWhateverIWant, value); }
}
#2. Отсутствие документации/образцов
это законно, но вот еще несколько документов / образцы:
- http://docs.reactiveui.net/ (это официальная документация ReactiveUI, работа в процессе, но определенно, где вы хотите начать)
- https://github.com/reactiveui/ReactiveUI.Samples
- https://github.com/reactiveui/RxUI_QCon
- https://github.com/play/play-windows
#3. -Я думал, далеко. лучшим подходом было бы определить очень простой интерфейс, а затем предоставить методы расширения в ReactiveUI для облегчения всех необходимых перегрузок"
реализовать IRxUILogger
вместо этого он имеет скудные два метода:) ReactiveUI заполнит остальное. IRxUIFullLogger
есть только если вам это нужно.
"кроме того, есть этот странный интерфейс IWantsToRegisterStuff"
тебе не нужно знать об этом :) это только для посвященных с ReactiveUI инициализирует себя так, что вам не нужно иметь шаблонный код.
Я отвечаю как кто-то, кто использовал ReactiveUI в нескольких производственных системах, имел проблемы с тем, как RxUI делает вещи, и представил патчи, чтобы попытаться исправить проблемы, которые у меня были.
предупреждение: Я не использую все функции RxUI. Причина в том, что я не согласен с тем, как эти возможности были реализованы. Я подробно расскажу о своих изменениях.
именования. Мне это тоже показалось странным. Это оказалось одной из особенностей Я вообще-то не употребляю. Я использую PropertyChanged.Fody, чтобы сплести уведомление об изменении с помощью AOP. В результате мои свойства выглядят как свойства auto.
Doco. Да может быть и больше. Особенно с новыми частями, такими как маршрутизация. Возможно, это причина, по которой я не использую весь RxUI.
ведение журнала. У меня были проблемы с этим в прошлом. См. тянуть запрос 69. В конце концов, я вижу RxUI как очень самоуверенную структуру. Если вы не согласны с этим мнением вы можете предложить изменения, но это все. Упрямство не делает его плохим.
Я использую RxUI с Caliburn Micro. CM регулирует положение View-ViewModel и вязку, экран и проводники. Я не использую обязательную конвенцию CM. RxUI обрабатывает команды и код ViewModel INPC и позволяет мне реагировать на изменения свойств, используя Reactive вместо традиционных подходов. Сохраняя эти вещи раздельно, я нахожу, что гораздо легче смешивать двое вместе.
все эти вопросы имеют ничего общего с тем, готовое производство? Нет. ReactiveUI стабилен, имеет приличного размера пользовательскую базу, проблемы решаются быстро в группа google и Павел восприимчив к дискуссии.
Я использую его в производстве, и до сих пор RxUI был совершенно стабильным. У приложения были проблемы со стабильностью, некоторые из них связаны с EMS, другие-с обработчиком UnhandledException, который вызывал больше проблем, чем решал, но у меня не было никаких проблем с частью ReactiveUI приложения. Тем не менее, у меня были проблемы с ObservableForProperty, которые я, возможно, использовал неправильно и работал последовательно (неправильно) в моем тестовом коде, а также в пользовательском интерфейсе во время выполнения.
-1. Пол объясняет, что _Upper связан с использованием отражения, чтобы добраться до частного поля в вашем классе. Вы можете использовать блок, такой как НИЖЕ, чтобы иметь дело с сообщениями StyleCop и Resharper, которые легко генерировать (из 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;
....
или измените свои свойства с полного
/// <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);
}
}
}
этот шаблон также полезен, когда вы на самом деле не укажите" простой " метод доступа к свойствам, но может потребоваться более производный вариант, где установка одного значения влияет на несколько других.
-2. Да, документация не идеальна, но я обнаружил, что после Rx забрать образцы RxUI было довольно легко. Я также отмечаю, что прыжки с 2->4, похоже, все пришли с изменениями для поддержки Windows 8/Windows 8 Phone, и, подобрав ReactiveUI для приложения Магазина Windows, поддержка DotNet 4.5 превосходна. т. е. использование [CallerName] теперь означает что вы просто это.RaiseAndSetIFChanged (value) нет необходимости в выражении.
-3. У меня нет никакой обратной связи на стороне регистрации, поскольку я не решил ее использовать.
-4. Я также не смешивался и не соответствовал другим фреймворкам.
есть также список других участников ReactiveUI 4.2 в http://blog.paulbetts.org/index.php/2012/12/16/reactiveui-4-2-is-released/, включая Фила Хаака.