У нас есть существующее приложение WPF, которое использует PRISM (6.x) с Unity (3.5.x) для DI. Мы собираемся добавить больше функциональности для этого приложения и хотели бы начать использовать ReactiveUI для любых новых модулей, которые нам нужно реализовать.Как использовать ReactiveUI внутри модуля PRISM
Мы надеялись минимизировать кривую обучения и продолжать использовать Unity и DI для наших ViewModels; однако ReactiveUI использует Splat для местоположения View, и до сих пор мне не удалось заставить мой модуль ReactiveUI фактически отображаться в регионе PRISM в нашем основном приложении, независимо от того, что я пробовал.
Единственная статья, которую я действительно нашел, это сообщение Issues with IMutableDependencyResolver and Structuremap in ReactiveUI, где кто-то писал собственную интеграцию.
Поэтому, учитывая некоторые ViewModel:
public class HelloWorldViewModel : ReactiveObject
{
string title = "Hello ReactiveUI";
public string Title
{
get { return title; }
set { this.RaiseAndSetIfChanged(ref title, value); }
}
}
и соответствующий ему вид:
<UserControl x:Class="PBI.ObjectMover.ReactSample.Views.HelloWorldView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">
<Grid>
<TextBlock Text="{Binding Title}" Foreground="Green" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Calibri" FontSize="24" FontWeight="Bold"></TextBlock>
</Grid>
</UserControl>
и код вида по за реализующий интерфейс IViewFor<T>
:
public partial class HelloWorldView : UserControl, IViewFor<HelloWorldViewModel>
{
public HelloWorldView()
{
InitializeComponent();
this.WhenAnyValue(x => x.ViewModel).BindTo(this, x => x.DataContext);
}
public HelloWorldViewModel ViewModel
{
get { return (HelloWorldViewModel)GetValue(ViewModelProperty); }
set { SetValue(ViewModelProperty, value); }
}
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModel", typeof(HelloWorldViewModel), typeof(HelloWorldView), new PropertyMetadata(null));
object IViewFor.ViewModel { get; set; }
}
Что необходимо в Инициализация IModule, чтобы подключить ReactiveUI ViewModel и View ?
public class ReactSampleModule : IModule
{
private readonly IRegionManager RegionManager;
public ReactSampleModule(IUnityContainer container, IRegionManager regionManager)
{
this.RegionManager = regionManager;
}
public void Initialize()
{
/* What do I need here to initialize ReactiveUI or Unity? */
/* Register views */
this.RegionManager.RegisterViewWithRegion("RightRegion", typeof(HelloWorldView));
}
}
Я попытался добавить призму локатора к просмотру в XAML:
<UserControl x:Class="PBI.ObjectMover.ReactSample.Views.HelloWorldView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
Я также попытался инициализация Splat в Initialize модуля:
public void Initialize()
{
/* Register types */
Locator.CurrentMutable.InitializeSplat();
Locator.CurrentMutable.InitializeReactiveUI();
Locator.CurrentMutable.Register(() => new HelloWorldView(), typeof(IViewFor<HelloWorldViewModel>));
/* Register views */
this.RegionManager.RegisterViewWithRegion("RightRegion", typeof(HelloWorldView));
}
До сих пор ничего не работало, но Я сомневаюсь, что мы единственные, кто видит преимущества использования модульной архитектуры PRISM с инфраструктурой ReactiveUI.