Caliburn Micro - 如何将依赖关系注入ViewModel而不要求其所有祖先具有相同的依赖关系?

时间:2014-07-11 20:53:43

标签: c# wpf caliburn.micro

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

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

如果父级具有相同的依赖关系,我的子ViewModel如何解析其依赖关系?

属性注入会保存我的父虚拟机不必知道他们孩子的依赖关系,但这只适用于接口属性,如果我用一堆无用的接口丢弃代码以适应依赖注入,那么我只是交易一个另一个问题。

2 个答案:

答案 0 :(得分:0)

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

物业注入可能是另一种帮助您的方法,例如

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

或延迟加载子ViewModel上的属性也可以帮助例如

private ISomeInterface aDependency;

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

答案 1 :(得分:0)

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

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

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

MEF功能强大得多,如果做得好可以做依赖,但它也有自己的特性。

HTH