繁体   English   中英

Caliburn Micro-如何在不要求其所有祖先具有相同依赖项的情况下将依赖项注入ViewModel?

[英]Caliburn Micro - How can I inject dependencies into a ViewModel without requiring all its ancestors to have the same dependencies?

我开始使用Caliburn Micro Framework,但遇到一个问题,我认为框架作者可能有解决方案,尽管我看不出它是什么。

假设我有一个父ViewModel,而不需要在运行时创建一个或多个子ViewModel。

我的子级ViewModel如何在其父级没有相同依赖项的情况下解决其依赖关系?

属性注入将使我的父级VM不必了解其子级的依赖关系,但这仅适用于接口属性,如果我用一堆无用的接口来填充代码以适应依赖关系注入,那么我只是在将一个问题换成另一个。

工厂模式将是一种方式。 另一个可能是使用DI容器来解决子ViewModel上的依赖关系(如果这些依赖关系是接口)。

注入财产可能是帮助您的另一种方式,例如

public void SomeProperty(ISomeInterface aDependency) 
{
    // use the dependency. Dependency Not required when object creation
}

或子ViewModels上的属性的延迟加载也可能有帮助,例如

private ISomeInterface aDependency;

public ISomeInterface MyDependency
{
    get 
    { 
        if (aDependency == null)
            aDependecy = new SomeConcreteClass();
        return aDependency;
    }
    set { aDependency = value; }
}

您可以使用MEF解决这个问题,也可以使用SimpleContainer,但是不需要将SC作为依赖项,因为如果您将SC用作容器,那么框架已经可以通过使用IoC静态类来了解它。 它具有一个Get()方法。 这将拉动您正在寻找的类型。 要注意的是它必须在容器中。 IoC不在乎它是SimpleContainer还是MEF,或多或少是抽象的容器。

var sometype = IoC.Get<ThatType>();

只要正确地装饰了要调用的类并在构建时将其成功拉入MEF容器,MEF便会允许[Import]作为属性。

MEF的功能强大得多,如果操作正确,它可以执行依赖关系,但是它也有自己的特质。

心连心

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM