【发布时间】:2014-01-24 17:17:35
【问题描述】:
我正在 PRISM 中实现应用程序,它需要从 dll 文件中动态导入模块。 我设法做到了 - 他们正在导入,但我无法显示它。 我决定创建一个特殊的模块来封装它——让我们称之为 ModuleDock。 所以我们有这样的东西:
Bootstrapper.cs:
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)Shell;
Application.Current.MainWindow.Show();
}
protected override IModuleCatalog CreateModuleCatalog()
{
var modules = new DirectoryModuleCatalog
{
LoadSubdirectories = true,
ModulePath = @"C:\Modules"
};
modules.AddModule(typeof(ModuleDockModule));
return modules;
}
}
Shell.xaml:
<ContentControl regions:RegionManager.RegionName="ModuleDockModule" />
ModuleDockModule.cs(在 ModuleDock 项目中):
public class ModuleDockModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("ModuleDockModule"))
{
_regionManager.RegisterViewWithRegion("ModuleDockModule", typeof(ModuleDockView));
}
}
public ModuleDockModule(IRegionManager regionManager, IUnityContainer unityContainer, IRegionViewRegistry regionViewRegistry)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<IModuleDockView, ModuleDockView>();
_unityContainer.RegisterType<IModuleDockViewModel, ModuleDockViewModel>();
}
}
最后在加载的模块之一中:
[Module(ModuleName = "TestModule", OnDemand = false)]
public class TestModuleModule : IModule
{
private readonly IRegionManager _regionManager;
private readonly IUnityContainer _unityContainer;
public void Initialize()
{
RegisterIoc();
if (_regionManager.Regions.ContainsRegionWithName("TestModule"))
{
_regionManager.RegisterViewWithRegion("TestModule", typeof(TestView));
}
}
public TestModuleModule(IRegionManager regionManager, IUnityContainer unityContainer)
{
_regionManager = regionManager;
_unityContainer = unityContainer;
}
private void RegisterIoc()
{
_unityContainer.RegisterType<ITestView, TestView>();
_unityContainer.RegisterType<ITestViewModel, TestViewModel>();
}
}
出于测试目的,我创建了该行 XAML:
<ContentControl regions:RegionManager.RegionName="TestModule" />
能否告诉我,为什么该行在 Shell.xaml 中显示 TestModule,但在 ModuleDockView.xaml 中不显示?
请注意,在最后阶段,我必须使用我平台的其他用户提供的各种数量的未知模块,所以我不能将任何东西设为静态(如模块名称或初始化)。 提前谢谢!
【问题讨论】:
-
为了确认,你是问为什么在ModuleDockView中不显示TestModule,而是在Shell中?这将取决于您在哪个 Xaml 页面中使用内容控件定义该区域。关于静态初始化,它们将在每个模块内进行。因此,您无需担心这一点。我会考虑在每个人都知道的枚举类中定义默认的 RegionNames。
-
@GOstrowsky - 没有。 TestModule 没有显示在 ModuleDockView 中 - 但我知道加载它时一切都是正确的,因为如果我将相同的区域放在 Shell.xaml 中并将其从 ModuleDockView.xaml 中删除(用于测试目的)它正在显示。从另一面 - 我使用带有静态字符串的类作为区域名称,但对于堆栈,我使用文本值作为示例以提高可读性。
-
感谢您的解释。问题在于模块的加载顺序,因为 TestModule 依赖于 ModuleDockModule 的 ModuleDockModule 区域。您能否检查 TestModule 是否在 ModuleDockModule 之前初始化?如果是这样,那么您需要在 TestModuleModule 类中添加一个依赖属性作为 [ModuleDependency("ModuleDockModule")],在模块名称下方属性。问候。
-
@GOstrowsky - 很好的答案。如果您回答我(不发表评论),我会很高兴,我会将您的回答标记为我的问题的解决方案。