我使用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
}
}
我不这样说是对的。或者它存在优雅,简单的东西。感谢您的意见和建议。
答案 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正确实例化,但取决于您的场景可能不是什么大问题。