棱镜使用发现的服务
Posted
技术标签:
【中文标题】棱镜使用发现的服务【英文标题】:Prism use of discovered service 【发布时间】:2021-12-05 01:11:17 【问题描述】:假设一个 Prism 版本 8 WPF 模块有一个需要调用服务的 ViewModel。 该服务实现了 IService,但存在许多此服务的实现。每个实现都是一个文件(类库),可能是一个 IModule(见下文)。
用户应该能够通过配置或文件夹的内容来配置要使用的文件。
显然(?)因此,我正在考虑通过创建正确类型的 ModuleCatalog 来发现模块,同时“引导”应用程序和服务可以包含在此模块中。 如果调用是无效调用(“即发即弃”),我想我可以简单地使用 EventAggregator(以观察者的身份实现服务),但是调用会返回一个值。
解决此问题的最佳方法是什么? (我想避免编写自己的程序集“发现/加载”某种可交换服务实现 dll 文件)
【问题讨论】:
【参考方案1】:如果你可以注入IEventAggregator
,你就可以注入IService
,不是吗?
如果没有模块注册实现,您将收到异常。如果有多个模块这样做,则最后一个获胜(至少以统一作为容器)。
【讨论】:
A SO 评论限制了字符数,请参阅连续的 cmets:感谢您的简单回答,这暗示了我的可能性。剩下的问题如下:“知名”模块(带有 ViewModel 的模块,从现在起称为“依赖模块”,依赖于服务模块。我首先尝试让两个模块“众所周知”(添加从应用程序到两个模块的项目引用)。只要在 ConfigureModuleCatalog 的“依赖模块”中配置服务模块之前,一切工作正常(否则向 ViewModel 的服务注入抛出)。 然后我从应用程序项目引用中删除了服务模块,并且在 ConfigureModuleCatalog 中不再有 AddModule(保留“依赖模块”的 AddModule)。最后覆盖 CreateModuleCatalog 并为包含服务模块的目录创建了 DirectoryModuleCatalog,然后我立即强制初始化此模块目录,在“依赖模块”之前初始化服务模块并且一切正常。 我的问题是服务模块启动得太晚了。希望我更详细地了解如何控制顺序,例如,如果两个模块都应该由 DirectoryModuleCatalog 发现。那么多个目录呢(如果在每次调用之前更改 Path 属性,多个 IModuleCatalog.Initialize() 是否有用?无论如何,感谢您提示我正确的方法。 @EuroEager 你不想在一切都是Register
ed 之前开始Resolve
ing。您应该在OnInitialized
中进行初始导航(也许除了加载屏幕),即当所有内容都加载完毕时。
再次感谢,我从 OnInitialized 执行初始导航,它工作正常。如果应用程序复杂性增加(发现模块之间的模块间依赖关系等)并且发生类似情况,我会再次询问以上是关于棱镜使用发现的服务的主要内容,如果未能解决你的问题,请参考以下文章
棱镜错误:无法连接到 http://localhost:4466 的服务器