gpt4 book ai didi

c# - 如何将依赖项注入(inject) Caliburn.Micro 中的 View 模型?

转载 作者:太空狗 更新时间:2023-10-29 20:36:20 25 4
gpt4 key购买 nike

我真的希望这不是一个愚蠢的问题,但我不知何故无法识别使用 Caliburn.Micro 将依赖项注入(inject) View 模型的直接方法。

我有一个像这样的主壳(导体):

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShell
{
public ShellViewModel(IEventAggregator eventAggregator) {
ActivateItem(new DashboardViewModel());
}
}

现在我想将服务注入(inject) DashboardViewModel 但由于 ActivateItem 方法需要我传递一个实例(而不是类型),我我被迫自己提供服务。由于 ShellViewModel 不知道底层 IoC 容器,我必须将服务注入(inject) shell.. 对我来说,Caliburn 似乎试图强制执行所有 View 的完整图表应用程序中的模型和依赖项。

我知道我可以为我的反转控制容器使用静态访问器,但我真的不喜欢这种方法,因为我希望我的应用程序( Bootstrap )有一个单一的组合根,而不需要其他部分了解依赖注入(inject)等。

最佳答案

有几种方法完全取决于您选择的容器。

MEF [ImportMany] 在参数的构造函数中使用,将执行实际导入引用 Hello Screens 示例

您可以使用的内置 IoC 静态类 IoC.Get<IDashBoard>()IoC.GetAll<IDashBoard>() ,这假设您已将您的类型注册到您使用的容器中。小心这个,它可能被过度使用并导致反模式行为。我已经在我的一个执行仪表板的应用程序中完成了此操作,在我的 Container 实例中用 IDashBoard 标记的任何内容,与实际实现类相关联,都将被拉入集合 IoC.GetAll<IDashboard>()或基于 IoC.Get<IDashBoard>() 的集合中的第一项.

您还可以让您的仪表板继承 Conductor<IDashBoard>.Collection.AllActive ,允许您访问 Items 属性(作为集合的一部分)并使用 DashBoardViewMode 的 CTOR 填充它,使用 IoC.GetAll<IDashboard>()在那个地方获取仪表板上所需的所有项目。从那里,我在 OnActivate 中查询 Items 集合属性,并将其他 View 模型与我需要的属性相匹配,并相应地在 DashBoardView 上放置名为 ContentControls 的属性。

这确实是从您选择的容器中提取的,请记住,您可能只想了解容器的方法以通过其预期设计获取必要的项目。

我实际上离开了 MEF,因为在 CM 中使用的版本不适用于 Open Generics,调试缺少的 Export() 属性开始让我精疲力竭。

关于c# - 如何将依赖项注入(inject) Caliburn.Micro 中的 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com