【问题标题】:Is it possible to add new control to Prism application without recompilation?是否可以在不重新编译的情况下向 Prism 应用程序添加新控件?
【发布时间】:2016-02-03 13:53:38
【问题描述】:

Prism 应用程序中只有一个模块。让这个模块名称为ModuleA,应用程序名称为"CoolAppl"。这个应用程序很酷,它在生产中运行得非常好。一旦有人想向这个应用程序"CoolAppl"添加新按钮,例如"Delete Person"

我的问题是我或另一个城市的其他人是否可以通过添加带有必要按钮 Delete Person 的 dll 来将新按钮 "Delete Person" 添加到应用程序 "CoolAppl"ModuleA 而无需重新编译任何模块?

如果可能的话,请提供我应该挖掘/搜索的方向:)。

我正在使用这样的导航机制

 Uri wholeView = new Uri("ModuleA", UriKind.Relative);                                
 regionManager.RequestNavigate(RegionNames.TheBottomRegion, wholeView);
 var currentView = regionManager.Regions[RegionNames.TheWholeRegion].Views.ElementAt(0);
 regionManager.Regions[RegionNames.TheWholeRegion].Remove(currentView);

识别模块的类如下所示:

public class ModuleAModule : ModuleBase, IModule
{
    private readonly IRegionManager _regionManager;
    private readonly IUnityContainer _container;

    public ModuleAModule(IUnityContainer container, IRegionManager regionManager)
        : base(container, regionManager)
    {
        _regionManager = regionManager;
        _container = container;
    }

    protected override void InitializeModule()
    {            
        RegionManager.RegisterViewWithRegion(RegionNames.TheWholeRegion, typeof(LoginControl));
    }

    protected override void RegisterTypes()
    {
        Container.RegisterType<IViewModel, MyViewModel>();
        Container.RegisterTypeForNavigation<MySuperControl>();            
    }
}

【问题讨论】:

  • 您的问题没有一般性的答案。我们甚至不知道您如何实现导航、视图发现等。更具体,描述您的应用,提供相关代码。
  • @dymanoid 我添加了新代码。感谢您的建议

标签: c# wpf prism


【解决方案1】:

如果不重新编译意味着“不重新编译所有内容”,那么您可以重新编译 ModuleA。如果它的意思是“根本不重新编译”,那你就不走运了。 如果新按钮不需要在 ModuleA 中,您可以创建一个新的 ModuleB 而无需重新编译 CoolAppl 或 ModuleA(但您需要编译 ModuleB)。

不过,您可能已经安装了一个插件系统,从插件加载按钮,然后您可以为新按钮添加另一个插件。

【讨论】:

  • 我是否应该重新编译我的CoolAppl 以在bootstrapperModuleAnewly added Control 中从另一个人那里获得一个unityContainer
  • 我不确定你的意思。统一容器由引导程序创建,所有模块都相同。根据您的模块目录,您必须重新编译应用程序、编辑配置文件或将新模块放在正确的位置(即文件夹)。
  • 如果我将新控件(ModuleByBill) 放在正确的位置,则可以在CoolAppl 中存在的ModuleA 和新添加的ModuleByBill 之间进行通信,而无需重新编译ModuleA 和@ 987654331@?
  • 当然,这就是 EventAggregator 的工作方式——您在共享程序集中定义事件(即类),并且某个模块中的某些方法可以发布该事件,而另一个模块中的另一个方法可以订阅它。这些模块不需要知道彼此的任何东西。当然,如果您需要新事件,则需要更新共享程序集或添加新事件。然后,如果您希望现有模块订阅或发布新事件,则必须更改其代码并重新编译。但只要您对现有事件感到满意,就无需更改现有模块。
  • 如果 ModuleA 托管 ModuleByBill 为其注册视图的区域,当然,这将起作用。举个例子,我会在上面的答案中编辑一个,但今晚可能不会……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多