Prism中如何控制模块初始化的顺序
我将 Prism V2 与 DirectoryModuleCatalog 一起使用,并且需要按特定顺序初始化模块。所需的顺序由每个 IModule 实现上的属性指定。
这样,当每个模块初始化时,它们会将其视图添加到 TabControl 区域中,并且选项卡的顺序需要确定并由模块作者控制。
该顺序并不意味着依赖关系,而只是它们初始化的顺序。换句话说:模块 A、B 和 C 的优先级可能分别为 1、2 和 3。 B 不依赖于 A - 它只需要在 A 之后加载到 TabControl 区域中。这样我们就有了确定且可控的选项卡顺序。另外,B 在运行时可能不存在;因此它们将加载为 A, C,因为优先级应确定顺序 (1, 3)。如果我使用 ModuleDependency,那么模块“C”将无法加载其所有依赖项。
我可以管理如何对模块进行排序的逻辑,但我无法弄清楚将所述逻辑放在哪里。
I'm using Prism V2 with a DirectoryModuleCatalog and I need the modules to be initialized in a certain order. The desired order is specified with an attribute on each IModule implementation.
This is so that as each module is initialized, they add their View into a TabControl region and the order of the tabs needs to be deterministic and controlled by the module author.
The order does not imply a dependency, but rather just an order that they should be initialized in. In other words: modules A, B, and C may have priorities of 1, 2, and 3 respectively. B does not have a dependency on A - it just needs to get loaded into the TabControl region after A. So that we have a deterministic and controllable order of the tabs. Also, B might not exist at runtime; so they would load as A, C because the priority should determine the order (1, 3). If i used the ModuleDependency, then module "C" will not be able to load w/o all of it's dependencies.
I can manage the logic of how to sort the modules, but i can't figure out where to put said logic.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我不喜欢使用 ModuleDependency 的想法,因为这意味着当模块 b 不存在时,模块 a 不会加载,而实际上没有依赖项。相反,我创建了一个优先级属性来装饰模块:
然后我像这样装饰模块:
我创建了 DirectoryModuleCatalog 的新后代:
最后,我更改了引导程序以使用这个新目录:
我不确定是否带有程序集加载的内容是最好的做事方式,但它似乎有效......
I didn't like the idea of using ModuleDependency because this would mean that module a would not load when module b was not present, when in fact there was no dependency. Instead I created a priority attribute to decorate the module:
I then decorated the modules like this:
I created a new descendent of DirectoryModuleCatalog:
Finally, I changed the bootstrapper to use this new catalog:
I'm not sure if the stuff with assembly loading is the best way to do things, but it seems to work...
您可以在模块类上使用
ModuleDependency
属性来告诉加载器您的模块依赖于其他模块:You can use the
ModuleDependency
attribute on your module class to tell the loader that your module depends on other modules:您可以将默认的IModuleInitializer替换为自定义类的实例,该实例不是在加载模块后立即对其进行初始化,而是将它们存储在模块列表中。加载所有模块后,您可以按照您想要的顺序初始化它们。
如何实现这一点:
1) 在引导程序中,重写 ConfigureContainer 方法来替换 MyModuleInitializer 类实例的默认 IModuleInitializer,但使用名称维护默认初始化程序(例如,defaultModuleInitializer):
2) 创建执行所需的 storea-all-then-sort-and-initialize 过程的 MyModuleInitializer 类:
请注意,加载所有启动模块后,此类将恢复为简单地调用默认初始化程序。如果这不是您所需要的,请适当调整课程。
You can replace the default IModuleInitializer for an instance of a custom class that instead of initializing the modules right after they are loaded, stores them in a modules list. When all modules have been loaded, you initialize them in whatever order you want.
How to achieve this:
1) In the bootstrapper, override the ConfigureContainer method to replace the default IModuleInitializer for a instance of the MyModuleInitializer class, yet maintaining the default initializer with a name (for example, defaultModuleInitializer):
2) Create the MyModuleInitializer class that performs the desired storea-all-then-sort-and-initialize procedure:
Note that after all the startup modules have been loaded, this class reverts to simply invoking the default initializer. Adapt the class appropriately if this is not what you need.
我通过使用 ModuleDependency 属性解决了这个问题,它的作用就像一个魅力
I resolved this by using the ModuleDependency attribute and it worked like a charm
在 Bootstrapper 的 AddModule() 调用中,您可以指定依赖项。因此,您可以说 A 依赖于 B 依赖于 C,这将决定加载顺序。
http://msdn.microsoft.com/en-us/magazine/cc785479。 ASPX
In the AddModule() call in the Bootstrapper, you can specify a dependency. So, you can say A depends on B depends on C, and that will determine load order.
http://msdn.microsoft.com/en-us/magazine/cc785479.aspx
让这个起死回生,因为我似乎找到了一个不同的解决方案,有些人可能会觉得有用。我尝试了一下,它有效,但我还没有摸索出所有的优点和缺点。
我使用 DirectoryModuleCatalog 来获取所有模块的列表,这些模块全部放入一个文件夹中。但我注意到,在大多数情况下,我的所有“视图”模块都依赖于我的“服务”模块,这是一种非常常见的模式。任何服务都不应该依赖于视图。这让我开始思考,如果我们将所有服务模块放入一个文件夹中,将所有视图模块放入另一个文件夹中,并按正确的顺序创建两个不同的目录,会怎样。经过一番挖掘,我发现了这篇文章 其中提到了称为 AggregateModuleCatalog 的东西,它用于将一堆目录连接在一起。我在此处找到了此类的源代码。以下是我使用它的方式:
还有 AggregateModuleCatalog:
我还应该提到该文章指出了以下内容:
我不确定为什么会这样。很想听到任何关于原因的解释。
Bringing this back from the dead as I seem to have found a different solution that some might find useful. I tried it out and it works but I have yet to feel out all the pros and cons.
I was using DirectoryModuleCatalog to get a list of all my modules which were all placed into a single folder. But I noticed that for the most part all my "View" modules depended on my "Service" modules, and that was a pretty common pattern. No service should depend on a view. So that got me thinking, what if we just put all the service modules into a folder and all the view modules into another and created two different catalogs in the correct order. Some digging around and I found this article that mentions something called an AggregateModuleCatalog, and it's used to concatenate together a bunch of catalogs. I found the source code for this class here. And here's how I used it:
And the AggregateModuleCatalog:
I should also mention that the article states the following:
Why that is I'm not sure. Would love to hear any explanations as to why that might be.
有一个类似的问题,Fergus Bowns 的答案与 Haukinger 建议的 SmartDirectoryCatalog 相结合: Multiple DirectoryModuleCatalog in a Prism application
。我将其用于“可选依赖项”。希望这会对某人有所帮助。
PS:使用实际的 Prism Unity 7.2,您需要将 ModuleInfo 替换为 IModuleInfo
Had a similar problem an combined Fergus Bowns answer with the SmartDirectoryCatalog suggested by Haukinger: Multiple DirectoryModuleCatalog in a Prism application
. I use this for "optional dependencies". Hope this will help someone.
PS: with the actual Prism Unity 7.2 you need to replace ModuleInfo with IModuleInfo