Prism + Unity区域未正确加载

时间:2015-03-23 09:17:31

标签: c# wpf prism

我正在编写基于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接口的类。

0 个答案:

没有答案