加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在Caliburn.Micro中将依赖项注入视图模型?

发布时间:2020-12-15 07:45:09 所属栏目:百科 来源:网络整理
导读:我真的希望这不是一个愚蠢的问题,但我无法识别使用Caliburn.Micro将依赖关系注入视图模型的直接方法. 我有一个像这样的主壳(导体): public class ShellViewModel : ConductorIScreen.Collection.OneActive,IShell{ public ShellViewModel(IEventAggregator
我真的希望这不是一个愚蠢的问题,但我无法识别使用Caliburn.Micro将依赖关系注入视图模型的直接方法.

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

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

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

我知道我可以使用静态访问器来控制容器的反转,但我真的不喜欢这种方法,因为我想为我的应用程序(引导程序)创建一个组合根,而不需要知道其他部分关于依赖注入等.

解决方法

几种方法可以完全依赖于您选择的容器.

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

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

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

这确实是从您选择的容器中拉出来的,记住您可能只想要容器的方法来通过其预期的设计获取必要的物品.

我实际上离开了MEF,因为CM中使用的版本不适用于Open Generics并且调试缺少Export()属性开始让我疲惫不堪.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读