我正在使用Prism和Unity创建一个应用程序。 我使用DirectoryModuleCatalog从磁盘加载几个模块,这些模块显示在主菜单中,当您单击该特定模块的名称时,该模块的UI就会加载。 每个模块都是根据MVVM模型设计的,因此具有单独的视图和视图模型。

引导程序:

class Bootstrapper : UnityBootstrapper
{
   protected override DependencyObject CreateShell()
   {
        Shell shell = Container.Resolve<Shell>();
        shell.Show();
        return shell;
   }

   protected override void InitializeShell()
   {
        base.InitializeShell();
        App.Current.MainWindow = (Window)this.Shell;
        App.Current.MainWindow.Show();
   }

   protected override void ConfigureContainer()
   {
       base.ConfigureContainer();
       Container.RegisterType<IApplicationMenuRegistry, MenuRegistry>();
       Container.RegisterType<IApplicationCommands, ApplicationCommands>();
       Container.RegisterType<ShellViewModel, ShellViewModel>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());

       //****** When I uncomment following line, the HelloWorldModule2 doesn't get initialized ***********
       // Container.RegisterType<HelloWorldModule2ViewModel, HelloWorldModule2ViewModel>(new Microsoft.Practices.Unity.ContainerControlledLifetimeManager());
    }


    protected override IModuleCatalog  CreateModuleCatalog()
    {
        return new DirectoryModuleCatalog() { ModulePath = @"C:\Data\NPC Service Tool\Source\develop\POC\GUIWithPrism\Modules" };

    }
}

模块:

namespace HelloWorldModule2
{
    [Module(ModuleName="HelloWorldModule2")]
    public class HelloWorldModule2 : IModule
    {
        private IApplicationMenuRegistry menuRegistry;
        private HelloWorldModule2ViewModel viewModel;
        private IRegionManager regionManager;
        public HelloWorldModule2(IApplicationMenuRegistry menuRegistry, HelloWorldModule2ViewModel vm, IRegionManager regionManager)
        {
            this.menuRegistry = menuRegistry;
            this.regionManager = regionManager;
            this.viewModel = vm;
        }

        public void Initialize()
        {
            ObservableCollection<ViewObject> views = new ObservableCollection<ViewObject>();
            views.Add(new ViewObject() { Region = RegionName.Right, ViewType = typeof(HelloWorld2View) });
            views.Add(new ViewObject() { Region = RegionName.Left, ViewType = typeof(View2) }); 

            //****** Here the module gets registered in the main menu ******//
            menuRegistry.RegisterModuleMenuItem("HelloWorld2", "Hello World module 2",views,1);
            this.viewModel.Title = "Hello world module 2";
        }
    }
}

查看模型:

namespace HelloWorldModule2.ViewModels
{
    public class HelloWorldModule2ViewModel : NotificationObject
    {
        private string title;

        public string Title
        {
            get { return title; }
            set
            {
                title = value;
                RaisePropertyChanged(() => this.Title);
            }
        }
    }
}

我遇到了以下问题:如Bootstrapper代码所示,当我在Unity容器中注册视图模型时,我的模块未初始化(我在模块的Initialize方法中设置了一个断点,但从未命中)。 如果删除注册并删除模块构造函数中的vm参数,则模块会初始化。

另外,当我手动使用以下模块配置模块目录时:

protected override void ConfigureModuleCatalog()
{
   base.ConfigureModuleCatalog();
   ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
   moduleCatalog.AddModule(typeof(HelloWorldModule2.HelloWorldModule2));
}

代替DirectoryModuleCatalog ,即使注册了视图模型,它也可以正确初始化。

#1楼 票数:1

我担心您会误解模块类的目的。 模块类用于注册模块程序集中提供的类。 它仅用于基础设施目的。 因此,请勿尝试将任何业务逻辑放入模块类中。

未命中断点的原因是DI容器无法解析注入的类型HelloWorldModule2ViewModel。 您尝试在DI容器初始化之前使用它,因此初始化过程会因异常而中止。

请查看Prism手册并仔细阅读第2章。也请查看参考实现。

#2楼 票数:0

我知道这个问题很古老,但是我碰巧尝试研究类似的问题。 由于找不到很好的答案,因此希望在这里留下帮助。

我正在使用Prism和DirectoryModuleCatalog加载IModule实例,以将组件插入我的应用程序。 多年来,它一直运行良好,但是当我尝试向其中一个模块添加功能时,我发现其中一个模块未加载。 在Output或任何内容中无异常显示-模块不会初始化。 dll本身已加载,我可以使用其中的类,甚至可以动态访问的类。

经过大量研究,我偶然发现了一个事实,即该模块在外壳程序的配置文件中引用了一个类(用于加载自定义sql提供程序)。 当我删除该引用时,模块初始化就好了。 这类似于您注释掉上面从模块库中注册类型的代码。

我的结论(尚未完全验证)是,如果模块库已经加载,则DirectoryModuleCatalog或模块加载器在加载库时仅会发生反射,因此将无法/不会在模块上运行初始化。 这似乎是模块加载器中的错误,尤其是因为似乎没有错误/日志生成并且它只是默默地失败了。 还没有深入研究调试的Prism模块是否已加载以进行确认。

我认为我的解决方案是将自定义sql提供程序分离到一个单独的库中,尽管我认为我不必这样做。

  ask by keigezellig translate from so

未解决问题?本站智能推荐:

2回复

Microsoft Prism是否适合开发非GUI模块化实时服务器?

我正在开发一个服务器端应用程序,该应用程序应在启动时根据模块是否作为程序集动态加载模块。 我之前做过类似的事情,但是这次是生产代码,我想使用框架进行模块化和实例化(使用IoC容器)。 最初,我发现Microsoft的Prism(带有Unity)是执行此操作的合适框架,但是当我实现初始化和引导
1回复

如何在运行时加载所有PRISM模块?

同时,我正在创建模块目录以使用Unity加载模块。 我看过几个可以将所有模块加载到某个文件夹中的应用程序,我的意思是..该应用程序可以在运行时加载模块。 是否有可能做到这一点?
1回复

棱镜模块化/类型交换

我正在尝试构建基于Codeplex棱镜统一性的应用程序。 而且,我很难理解如何实现真正松耦合的应用程序。 以我的理解,模块应该是应用程序的完全独立的工作部分。 换句话说,另一个内部有一个应用程序。 意味着没有一个开发项目引用到另一个项目。 但是模块之间的交换如何发生? 我正在
3回复

MEF子容器模块未初始化

我有一个简单的容器层次结构,其中的父容器是在Shell MEFBootstrapper中使用目录目录定义的,而子容器是通过具有不同目录的父容器创建的。 我的子容器也使用DirectoryCatalog(与父容器不同的路径),我可以看到该容器在运行时具有装配和零件信息。 但是,永远不会
1回复

棱镜模块的依赖性

我正在尝试编写与“团结模块化”项目类似的代码。 我构建了2个模块:模块A(通过代码加载)和模块D(从目录加载)。 两者都成功加载。 我作为参考的链接是https://msdn.microsoft.com/en-us/library/ff921068(v=pandp.40).aspx源代
1回复

棱镜壳取决于模块

我有一个使用Unity作为IoC容器的Prism WPF应用程序,其中包含一个名为“ LanguageModule”的模块: 我的ShellViewModel需要此模块的实例。 我的Shell需要ShellViewModel的实例。 但是在加载模块之前,将调用CreateShell
1回复

Unity dummy解决了最小化对象初始化的成本

我有一个组件,构造器需要很长时间才能执行(它使用SAPBOBSdll连接到SAP Business One数据库)在我的Prism应用程序中。 我在Unity容器中注册它: 当我尝试解决此组件时,需要很长时间(大约15秒)。 使用不同的线程预先解析组件是不好的做法,所以当我尝试使用它
1回复

WPF棱镜模块错误解决IUnityContainer

我有一个非常基本的棱镜应用程序,正在尝试将其用作较大项目的开始。 我有一个带有定义为“ MainContent”的单个区域的外壳。 项目中有3个模块。 MainMenuModule,MovieModule和TVModule。 电影和电视模块取决于MainMenuModule。 使用Di