我正在编写基于WPF和Prism库的应用程序。我已经开始使用Mef DI支持编写了一些代码,这些代码正在运行。
然后我决定切换到Unity库。
这就是我的问题:Prism没有正确处理区域。 RegionManager仅包含最后创建的区域。
这是我的代码:
我已将Bootstrapper更改为Unity:
public class OrtManBootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)this.Shell;
Application.Current.MainWindow.Show();
}
protected override void ConfigureContainer()
{
Container.RegisterTypes(
AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default,
WithLifetime.ContainerControlled);
base.ConfigureContainer();
}
protected override void ConfigureModuleCatalog()
{
List<Type> types = new List<Type>
{
typeof (SearchModule),
typeof (ServicesModule),
};
foreach (var type in types)
{
ModuleCatalog.AddModule(new ModuleInfo(type.Name, type.AssemblyQualifiedName));
}
}
}
外壳:
<Window x:Class="OrtMan.App.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:regions="http://www.codeplex.com/CompositeWPF"
Title="Shell" Height="700" Width="1000">
<DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Border BorderBrush="Black" BorderThickness="1" Height="75" DockPanel.Dock="Top" Margin="0 0 0 5" >
<StackPanel Orientation="Horizontal" >
<ContentControl regions:RegionManager.RegionName="SearchService" Width="Auto" MinWidth="100" Margin="0 0 10 0"></ContentControl>
<ContentControl regions:RegionManager.RegionName="Ribbon"></ContentControl>
</StackPanel>
</Border>
<Border BorderThickness="1" BorderBrush="Red" DockPanel.Dock="Bottom" Height="75" >
<ContentControl regions:RegionManager.RegionName="StatusBar"></ContentControl>
</Border>
<Border BorderBrush="Blue" BorderThickness="1" Margin="0 0 0 5">
<ContentControl regions:RegionManager.RegionName="MainPage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></ContentControl>
</Border>
</DockPanel>
</Window>
我的简单模块:
public class SearchModule : IModule
{
public SearchModule(IRegionManager regionManager)
{
RegionManager = regionManager;
}
public IRegionManager RegionManager { get; set; }
public void Initialize()
{
//todo: register View
var searchService = RegionNames.SearchService;
RegionManager.RegisterViewWithRegion(searchService, typeof (SearchComponent));
}
}
可以肯定的是,我仔细检查了地区名称等。
问题是RegionManager似乎只注册了最后一个区域。如果我将var searchService = RegionNames.SearchService;
更改为var searchService = RegionNames.MainPage;
组件正在注册到MainPage区域。
我不知道出了什么问题。我很确定它一直在Mef容器下工作,我没有改变任何可能破坏它的东西。
--- --- EDIT
我有双重支持:当我使用Unity支持创建简单应用程序时,它只加载最后一个区域。当我在这个应用程序中将Unity更改为Mef时,它开始正常工作。
- 编辑2 -
似乎我的类型注册在contaier(按照惯例)打破了一些东西。当我将其更改为手动注册时,似乎一切正常。
但我仍然有一个问题:为什么我不能按惯例使用注册?或者我应该如何使用它来注册所有实现IService
接口的类。