0

我用 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

}

}

我不认为这种方式是正确的。或者它存在一些优雅、简单的东西。感谢您的意见和建议。

4

2 回答 2

1

致:阿贝·海德布莱希特。

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

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,当所有可以满足的导入都满足时调用。

我认为在视图模型类的构造函数中对服务类的初始化接口进行单元测试会更好。

于 2011-01-14T22:01:01.013 回答
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 被正确实例化,但取决于您的场景,这可能不是什么大问题。

于 2011-01-14T21:27:05.360 回答