在视图模型类中注入许多类

时间:2011-01-14 20:30:23

标签: wpf mvvm mef caliburn.micro

我使用MVVM设计开发wpf应用程序。作为MVVM框架,我使用Caliburn Micro。我在外部装配中使用的服务,它是在带有MEF的视图模型类中注入的。

服务中的问题我有很多小班,我尝试尊重SOLID原则。

[Export(typeof(IClassA)]
public class ClassA : IClassA
{}

[Export(typeof(IClassB)]
public class ClassB : IClassB
{}

[Export(typeof(IClassC)]
public class ClassC : IClassC
{}

//...
[Export(typeof(IClassK)]
public class ClassK : IClassK
{}

课程数约为12-15。

我需要在视图模型类中使用这个类。所以我用这个:

public class MyViewModelClass
{
 private interface IClassA _a;
 private interface IClassB _b;
 private interface IClassC _c;


//...
 private interface IClassK _k;


[ImportingConstructor]
public MyViewModelClass(IClassA a, IClassB b, IClass c, ..., IClassK k)
{
_a=a; _b=b; _c=c; ...  _k=k

}

}

我不这样说是对的。或者它存在优雅,简单的东西。感谢您的意见和建议。

2 个答案:

答案 0 :(得分:1)

致:Abe Heidbrecht。

我有点困惑。如果我用这个:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a;  // I need init _a?
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // what code must be here ?
        //how can I check if all import was success
    }
}

由于。

IPartImportsSatisfiedNotification只有一个方法:OnImportsSatisfied,在满足所有可以满足的导入时调用。

我认为在视图模型类的contstructor中单元测试服务类的init接口更好。

答案 1 :(得分:0)

MEF可以导入到字段(甚至是私有字段)。如果您想让生活更轻松一点,您可以使用ImportAttribute装饰字段。如果您想知道所有导入何时完成,只需实现IPartImportsSatisfiedNotification接口:

public class MyViewModelClass : IPartImportsSatisfiedNotification
{
    [Import]
    private IClassA _a; 
    [Import]
    private IClassB _b; 
    [Import]
    private IClassC _c;

    ...

    public void OnImportsSatisfied()
    {
        // add initialization code here
    }
}

这几乎要求您使用MEF来确保您的ViewModel正确实例化,但取决于您的场景可能不是什么大问题。